假设我要使用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)
谢谢
- 我如何知道 _POSIX_C_SOURCE 需要等于哪个值?我在网上找到了多个值。
每个 POSIX 标准定义都有一个值。所以你可以使用任何值:
最好是使用满足这两个标准的最低值。
- 为什么这个定义的位置会影响编译?
POSIX 说:
系统接口第 2 章第 2 节编译环境:符合 POSIX 的应用程序应确保在包含任何标头之前定义功能测试宏 _POSIX_C_SOURCE。
否则可能会导致错误/不兼容的包含定义...在任何包含之前定义它,确保所有内容都在相同的 POSIX 版本下...
推荐阅读:The Open Group 基本规范第 7 期,2018 年版,2 - 一般信息
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |