如何知道应将_POSIX_C_SOURCE定义为哪个值?

tra*_*rad 5 c posix

假设我要使用timespec在time.h中定义的structure。根据手册,我只需要包含time.h。但是,在c99中编译时,这还不够:

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

struct timespec abcd;

int main(int argc, char *argv[])
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我在网上找到的信息(不在手册页中),我需要添加以下内容:

#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>
....
Run Code Online (Sandbox Code Playgroud)

谢谢

Jea*_*nès 6

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

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

  1. 定义您需要的功能
  2. 您的托管操作系统支持

最好是使用满足这两个标准的最低值。

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

POSIX 说:

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

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

推荐阅读:The Open Group 基本规范第 7 期,2018 年版,2 - 一般信息