首页 > 解决方案 > 如何知道我应该定义哪个值 _POSIX_C_SOURCE?

问题描述

例如,假设我想使用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

所以我有几个问题:

#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>
....

谢谢

标签: cposix

解决方案


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

每个 POSIX 标准定义都有一个值。因此,您可以使用以下任何值:

  1. 定义您需要的功能
  2. 受您的主机操作系统支持

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

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

POSIX 说:

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

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

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


推荐阅读