Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5512162
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: LINUX

2011-12-26 12:09:37

++++++APUE读书笔记-02UNIX标准和实现-07特征测试宏++++++

 

7、特征测试宏
================================================
 如前面所述,头文件中定义了大量的POSIX.1和XSI标记。但是大多数的实现也向头文件中添加了不少它们自己的定义。如果我们想要编译一个只依赖那些POSIX标记的程序,而且不使用任何和实现相关的定义限制,我们需要定义常量_POSIX_C_SOURCE。所有的POSIX.1头文件使用这个常量,当定义_POSIX_C_SOURCE的时候,排除任何与实现相关的定义。
 之前版本的POSXI.1标准定义了_POSIX_SOURCE常量。这个常量后来在2001年的POSIX.1中被_POSIX_C_SOURCE常量替代。
 常量_POSIX_C_SOURCE 和 _XOPEN_SOURCE被称作“特性宏”。所有的特性宏以一个下划线开始。当使用它们的时候,一般这样:
    cc -D_POSIX_C_SOURCE=200112 file.c
 这样编译的C程序,和在程序代码中写了" #define _POSIX_C_SOURCE 200112"再编译的效果一样。
 如果使用Single UNIX Specification第三个版本的特性,那么我们需要定义 _XOPEN_SOURCE为600,这样和定义_POSIX_C_SOURCE为 200112L的POSIX.1功能效果一样。
 Single UNIX Specification定义了c99工具作为C编译环境,所以我们可以用如下命令:
    c99 -D_XOPEN_SOURCE=600 file.c -o file
 为了打开gcc编译器的1999版ISO C的扩展功能,我们使用-std=c99选项,如下:
    gcc -D_XOPEN_SOURCE=600 -std=c99 file.c -o file
 另外一个特性宏是_ _STDC_ _,这个宏在C编译器遵从ISO C标准的时候会自动被C编译器定义。这允许我们可以写既在ISO C 又在非ISO C编译器下编译的程序。例如,如果想要采用ISO C定义的特性,那么如果支持的话,头文件中应该包含类似如下代码:
    #ifdef _ _STDC_ _
    void  *myfunc(const char *, int);
    #else
    void  *myfunc();
    #endif
 尽管大多数C编译器都支持ISOC特性,但是也有一些头文件中使用__STDC__特性宏。

参考:

 

 

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