c - 如何知道我应该定义哪个值 _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
所以我有几个问题:
我怎么知道我需要 _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>
....
谢谢
解决方案
- 我怎么知道我需要 _POSIX_C_SOURCE 等于哪个值?我在网上找到了多个值。
每个 POSIX 标准定义都有一个值。因此,您可以使用以下任何值:
- 定义您需要的功能
- 受您的主机操作系统支持
最好是使用同时满足这两个标准的最低值。
- 为什么这个定义的位置会影响编译?
POSIX 说:
系统接口第 2 章。第 2 节编译环境:符合 POSIX 的应用程序应确保在包含任何标头之前定义功能测试宏 _POSIX_C_SOURCE。
否则可能会导致错误/不兼容的包含定义...在任何包含之前定义它确保所有内容都在相同的 POSIX 版本下...
推荐阅读:The Open Group Base Specifications Issue 7, 2018 edition, 2 - General Information
推荐阅读
- bash - Bash 删除变量中最后 2 个“/”符号之前的所有符号
- python - 用于创建可点击链接抛出错误的 Python 代码
- javascript - 如何通过提供其键数组来动态修改对象值?
- linux - Linux 上的进程隔离?
- powershell - New-Object -Type Microsoft.GroupPolicy.GPDomain 远程运行时失败
- perforce - Perforce 流复制似乎不是正确的选择
- javascript - Power BI 筛选器显示附加值并选择它
- python - 如何在 Python 中执行静态程序分析以查找具有某些属性的函数?
- javascript - 带有 Var 的 Javascript 范围
- xamarin.android - 无效的密钥库格式 - 在 Azure DevOps 构建管道中签署 Android APK