如何确定_POSIX_C_SOURCE应定义的取值?以timespec结构体为例
_POSIX_C_SOURCE的具体取值 这个问题其实涉及到POSIX特性测试宏的使用——因为struct timespec并不是C标准(比如C99)的一部分,而是POSIX标准引入的扩展,所以默认情况下C编译器不会暴露这些非标准定义,必须通过定义特定的宏来启用。
下面是确定_POSIX_C_SOURCE取值的几个关键步骤:
查目标特性的POSIX版本要求
最直接的方法是查看你要使用的函数/结构体的man手册。比如执行man 3 timespec,在手册的Feature Test Macro Requirements部分,会明确标注需要的宏值:struct timespecrequires_POSIX_C_SOURCE >= 200112L或者更高版本(比如200809L对应POSIX.1-2008)。
不同的POSIX特性对应不同的版本,比如早期的POSIX.1-1997对应_POSIX_C_SOURCE=199506L,POSIX.1-2001对应200112L,POSIX.1-2008对应200809L。检查你的系统和编译器支持的最高版本
你可以在代码中打印系统默认支持的POSIX版本来参考:#include <stdio.h> #include <unistd.h> int main() { printf("Current POSIX version: %ld\n", _POSIX_VERSION); return 0; }编译运行后,输出的数值就是当前系统默认兼容的POSIX版本对应的宏值。比如glibc通常支持到
200809L甚至更高。选择满足需求的最小版本
不要盲目使用最高的版本值,除非你确实需要该版本引入的新特性。比如如果只是使用struct timespec,200112L就足够;但如果同时用到了POSIX.1-2008新增的函数(比如clock_gettime的某些扩展),那就需要设置成200809L。注意宏定义的位置
必须在包含任何头文件之前定义这个宏,否则编译器不会生效。比如你的代码正确写法应该是:#define _POSIX_C_SOURCE 200809L #include <stdio.h> #include <time.h> struct timespec abcd; int main(int argc, char *argv[]) { return 0; }
另外补充一点:有些系统可能会用_XOPEN_SOURCE宏来启用POSIX扩展,但_POSIX_C_SOURCE是更直接针对POSIX标准的选择,推荐优先使用它。
内容的提问来源于stack exchange,提问作者user7659542

