如何知道我应该定义哪个值_POSIX_C_SOURCE?

时间:2018-05-04 05:05:13

标签: c posix

比方说,我想使用结构timespec,它在time.h中定义。根据联机帮助页,我只需要包含time.h.但是当在c99中编译时,这还不够:

#include <stdio.h>
#include <time.h>

struct timespec abcd;

int main(int argc, char *argv[])
{
   return 0;
}

根据我在网上找到的信息(不在联机帮助页中),我需要添加:

#define _POSIX_C_SOURCE 200809L

所以我有几个问题:

  • 我如何知道_POSIX_C_SOURCE需要哪个值相等?我在网上找到了多个值。

  • 为什么这个定义的位置会影响编译? (参见下文)

#include <stdio.h>

#define _POSIX_C_SOURCE 200809L

#include <time.h>

struct timespec abcd;

int main(int argc, char *argv[]) { return 0; }

$ gcc test.c -Wall -Wpedantic -std=c99 -o test test.c:9:25: error: field ‘time_last_package’ has incomplete type struct timespec time_last_package;

汇编得很好:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <time.h>
....

由于

2 个答案:

答案 0 :(得分:2)

另一个答案给出了很好的背景。但是,也可以在编译器级别定义它,因此您不必将其放在源代码中。至少使用catch和glibc,命令行选项

gcc
如果包含-D_POSIX_C_SOURCE=199309L

足以确保nanosleepstruct timespec可用。

答案 1 :(得分:1)

  
      
  • 我如何知道_POSIX_C_SOURCE需要哪个值相等?我在网上找到了多个值。
  •   

每个POSIX标准定义都有一个值。所以你可以使用任何值:

  1. 定义您需要的功能
  2. 由您的托管操作系统支持
  3. 最好是使用符合这两个标准的最低值。

      
        
    • 为什么这个定义的位置会影响编译?
    •   

    POSIX说:

      

    系统接口第2章第2节编译环境:符合POSIX的应用程序应确保功能测试   宏_POSIX_C_SOURCE是在包含任何标题之前定义的。

    否则可能导致错误/不兼容的包含定义...在之前定义确保所有包含在相同的POSIX版本之下......

    推荐阅读:The Open Group Base Specifications Issue 7, 2018 edition, 2 - General Information