支持C语言的平台有许多,常见的编译器如VC、gcc、Clang等。不同的编译器共同点是都支持标准C(ANSI C),但是各自却又有自己独立的、平台相关的功能以及函数接口。这通常为程序的移植性带来很多问题。这里我简单谈一下解决方案。
常见思路
常见的解决跨平台移植的思路就是利用 宏。不同编译器有各自不同的宏,宏有很多,具体可以参考编译器的相关手册。通过判断一个宏是否存在来选择性的包含头文件或调用函数,其本质就是一种条件编译。
比如一些平台相关的函数,在不同平台要包含不同文件。
#if defined __GNUC__
#include <unistd.h>
#elif defined _MSC_VER
#include <windows.h>
#endif
#if defined 在本例中也可以用#ifdef 替换,但是如果是复杂的条件编译(比如if后面同时判断多个宏),就只能用#if defined 实现了。
__GNUC__
是在gcc编译器中定义的宏,_MSC_VER
是Windows中VC编译器中的宏。当然了你还可以选择这两个编译器中的其他宏来实现这一功能,只要能确保是两个编译器中平台相关的宏就行。
_MSC_VER
这个宏还能判断VC的版本。比如:
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
...
它的意思是如果VC的版本大于VC 6.0,那么...
该宏的详细参考,很容易百度到:
- MS VC++ 12.0 _MSC_VER = 1800 (Visual C++ 2013)
- MS