操作系统-关于C语言跨平台编码问题

问题描述

关于C语言跨平台编码问题

求助,如题,现在的系统又多又杂乱,想问一下,应该从哪个角度来分析C语言跨平台问题?
例如,想要编一个跨平台的小程序A,适用于目前所有的操作系统,也适用于32位和64位。
1. 怎么判断当前的系统平台?比如说这样?
if unix
if hp
else if solaris
else ?
else if linux
...
else windows
...
这样明显有点穷举的意思,怎么确保自己罗列的就是目前所有的在用的操作系统?

2.怎么判断当前是否需要引入不同的头文件来确保某些函数在任何系统下都能用?
意思是所有用到非标准头文件并且非自定义函数的都要考虑各个平台的处理?

3.C语言在不同环境下的编码不同是因为操作系统的原因还是因为使用的编译器的原因?意思是不同的编译器是不是就会有可能有不同的表现?

对跨平台基本没有了解,特意求教,希望各路大神指导一下。感激不尽。

解决方案

平台相关的代码放OS目录里面

解决方案二:

代码,基本上是无法判断操作系统的。因为要将C不语言编译成可以在不同的操作系统下运行的程序,需要不同的编译器的。
没有可能使用一个编译器,编译出可以在所有系统上运行的程序。
C语言,只是功能的实现语言,但它不是可以执行的机器码。

编码时,一般针对不同的操作系统使用不同的宏来区分,特别是要使用操作系统的一些特性时。
一样的对于非标准头文件,也可以使用宏来区分不同的操作系统

C语言实现的功能,基本上与编译器没有关系。除非是一些特殊的语法!但在编写跨平台的代码时,肯定不能使用这些特殊的语法。

解决方案三:

可以看看各种开源跨平台代码,都是利用编译器的宏来判断os类型,然后定义不同代码来实现的。这个是成熟方案了

时间: 2025-01-01 15:47:25

操作系统-关于C语言跨平台编码问题的相关文章

多语言网页编码教程

这几天研究UTF-8编码,太晕了,把我的看法和各位讨论讨论.欢迎来批啊.以下都是我的想法,哪里有不对的请不吝赐教,帮忙指出来.==========================================================相关的题外话:一.操作系统window系统内部都是unicode的.文件夹名,文件名等都是unicode的,任何语言系统下都能正常显示.二.输入法:微软拼音输出的是Unicode的,智能ABC输出是简体中文的(所以智能ABC在非简体中文系统根本不能用,只能打

Linux操作系统下C语言编程入门

这里向大家介绍一下在Linux/UNIX 的机器上,进行 C/C++ 编程的一些入门级知识. · 所需具备的背景知识 · 开发所需的基本环境 · 获得帮助的途径 · 通过一个实例了解基本步骤 Prerequisite 先决条件: 在Linux上编写 C 程序,至少要熟悉以下两方面的基础知识: 1. C语言的编程基础,至少要知道一些基本的语法,控制流程等编程常识. 对常用的标准 C 函数库有常识性的了解. 2. 对Linux/UNIX 的操作有常识性的了解,掌握常用的shell 命令,如 ls,

C语言安全编码之数值中的sizeof操作符_C 语言

通常来说获取数组的长度时不要对指针应用sizeof操作符. 现来看看下面这段代码: void clear(int array[]) { for(size_t i = 0; i < sizeof(array) / sizeof(array[0]); i++) { array[i] = 0; } } void dowork(void) { int dis[12]; clear(dis); /*...*/ } clear()使用sizeof(array) / sizeof(array[0])这种用法确

C语言安全编码数组记法的一致性_C 语言

对C语言程序来说,在同一文件中时,void func(char *a);  和  void func(char a[]); 完全等价 但在函数原型之外,如果一个数组在一个文件中声明为指针,在另一个不同的文件中声明为数组,那么它们是不等价的 示例代码如下: //main.c #include<stdlib.h> enum {ARRAYSIZE = 100}; char *a; void insert_a(void); int main(void) { a = (char*)malloc(ARRA

C语言安全编码之数组索引位的合法范围_C 语言

C语言中的数组索引必须保证位于合法的范围内! 示例代码如下: enum {TABLESIZE = 100}; int *table = NULL; int insert_in_table(int pos, int value) { if(!table) { table = (int *)malloc(sizeof(int) *TABLESIZE); } if(pos >= TABLESIZE) { return -1; } table[pos] = value; return 0; } 其中:p

操作系统与c语言

  以下是根据看书后的理解做的总结:   最早,unix是使用汇编编写,但是非常简单.后来觉得汇编,换种机器又得重新用另外一种机器汇编重写,太麻烦.于是想设计一种通用的语言,到各种机器上都能运行 当时发明了b语言,但是b语言并不成功(据说是很多缺陷,缺乏数据结构),后来者在此基础上改进,发明了c语言.使用c语言重写unix,后来c语言就成为一种编写操作系统的语言了.当时有c语言编译器,使得转化成机器语言很容易. 现在终于明白了,为什么以前看的资料说:c语言是为了编写Unix操作系统而发明的语言.

《Linux 高级程序设计(第三版)》——第1章  Linux下C语言开发环境 1.1 Linux操作系统简介

第1章 Linux下C语言开发环境 Linux应用程序开发平台有别于Windows应用程序开发平台,因此在介绍具体编程内容之前,本书第1.2章主要介绍Linux操作系统下C语言程序的开发环境和开发工具. 本章主要介绍Linux下C语言开发环境,包括一些基本概念和基本编程环境.本章第1节主要对Linux操作系统及其相关术语进行了简要介绍. 本章第2节主要介绍Linux操作系统下编程基本概念以及如何获得Linux下的帮助文件,包括Linux操作系统下C语言库文件标准以及系统调用的基本概念. 本章第3

C++使用WideCharToMultiByte函数生成UTF-8编码文件的方法_C 语言

WideCharToMultiByte函数映射一个unicode字符串到一个多字节字符串. 函数原型: int WideCharToMultiByte UINT CodePage, //指定执行转换的代码页 DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符 LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区 int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数 LPSTR

《PostgreSQL服务器编程》一一2.6 过程化语言

2.6 过程化语言 SQL Server允许你使用任何产生CLR的语言来创建DLL.这些DLL必须在启动的时候被加载到服务器里面.为了在运行时间创建一个程序,并且使它立即可用,唯一的选择就是内建的SQL方言--Transact SQL(TSQL). MySQL有一个叫做插件的功能.其中一种合法的插件类型是过程化语言.几种语言完成加工后,借由插件系统可以和MySQL一起工作.这些语言包括了最流行的几种语言,比如PHP.Python等.这些函数不能被用在存储过程与触发器中,但是它们可以被普通SQL语