Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1746527
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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__特性测试宏可以在许多头文件里找到。


阅读(2626) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~