分类: 系统运维
2012-03-27 17:49:14
正如我们之前所述,在头文件里定义了许多POSIX.1和XSI的符号。但多数系统实现在POSIX.1和XSI定义之外,还可加入它们自己的定义。如果
我们想编译一个程序,使它只依赖于POSIX定义而不使用任何系统实现定义的限量,我们需要定义常量_POSIX_C_SOURCE。所有的
POSIX.1的头文件都使用这个常量来排除所有实现定义。
POSIX.1标准的前一个版本定义了_POSIX_SOURCE常量。它在POSIX.1的2001版本被_POSIX_C_SOURCE取代而被废弃。
常量_POSIX_C_SOURCE和_XOPEN_SOURCE被称作特性测试宏。所有的特性测试宏都以下划线开头。当被使用时,它们被典型地定义在cc命令里,比如:
cc -D_POSIX_C_SOURCE=200112 file.c。
这样会在任何头文件被导入C程序之前定义特性测试宏。如果我们想要只使用POSIX.1的定义,我们可以在源文件的第一行写上:
#define _POSIX_C_SOURCE 200112
为了在程序里使用SUSv3的功能,我们必须定义常量_XOPEN_SOURCE为600。这与定义_POSIX_C_SOURCE为200112L引进POSIX.1的功能是一样的效果。
SUS定义了c99工具作为C编译环境的接口。使用它我们可以这样编译一个文件:
c99 -D_X_OPEN_SOURCE=600 file.c -o file
为了在gcc编译器启用1999 ISO C扩展,我们使用-std=99选项,比如:
gcc -D_XOPEN_SOURCE=600 -std=c99 file.c -o file
另一个特性测试宏是__STDC__,它被C编译器自动定义如果它遵守ISO C标准。这样允许我们编写在ISO C编译器和非ISO C都能编译的程序。例如,为了在编译器支持的情况下使用ISO C的原型特性,我们可以这样定义头文件:
#ifdef __STDC__
void *myfunc(const char *, int);
#else
void *myfunc();
#endif
尽管今天大多数C编译器都支持ISO标准,但__STDC__特性测试宏可以在许多头文件里找到。