比方说,我想使用结构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>
....
由于
答案 0 :(得分:2)
另一个答案给出了很好的背景。但是,也可以在编译器级别定义它,因此您不必将其放在源代码中。至少使用catch
和glibc,命令行选项
gcc
如果包含-D_POSIX_C_SOURCE=199309L
,足以确保nanosleep
和struct timespec
可用。
答案 1 :(得分:1)
- 我如何知道_POSIX_C_SOURCE需要哪个值相等?我在网上找到了多个值。
每个POSIX标准定义都有一个值。所以你可以使用任何值:
最好是使用符合这两个标准的最低值。
- 为什么这个定义的位置会影响编译?
POSIX说:
系统接口第2章第2节编译环境:符合POSIX的应用程序应确保功能测试 宏_POSIX_C_SOURCE是在包含任何标题之前定义的。
否则可能导致错误/不兼容的包含定义...在之前定义确保所有包含在相同的POSIX版本之下......
推荐阅读:The Open Group Base Specifications Issue 7, 2018 edition, 2 - General Information