c - FreeBSD:隐式声明 getpagesize 并定义 _POSIX_C_SOURCE=200809L。

标签 c posix freebsd posix-api

我目前正在将软件项目的一些操作系统相关功能从 Linux 移植到 FreeBSD。因此,如果在 FreeBSD 10.1 上定义了 _POSIX_C_SOURCE=200809L,我使用 getpagesize 发现了以下问题。

我创建了一个小测试程序

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
        int i = getpagesize(); 

        return 0;
}

如果我编译使用的是

cc test.c -o test 

它编译时没有任何警告。但是如果我定义 _POSIX_C_SOURCE=200809L (我在代码的其他部分需要的 getline 函数的正确 POSIX 定义的结果)我得到:

cc test.c -D_POSIX_C_SOURCE=200809L
test.c:5:10: warning: implicit declaration of function 'getpagesize' is invalid in C99 [-Wimplicit-function-declaration]
        int i = getpagesize(); 
                ^

尽管我按照 getpagesize 的联机帮助页中的说明包含了 unistd.h。如何在仍定义的 _POSIX_C_SOURCE 的情况下编译代码而不发出警告?

最佳答案

(1) _POSIX_C_SOURCE 是一个错误的定义。您需要_XOPEN_SOURCE。例如:

cc -D_XOPEN_SOURCE=700 test.c 

cc -D_XOPEN_SOURCE=600 test.c 

600700 表示您的应用程序期望从系统库获得的单一 Unix 规范(简称 SUS,又名开放组规范,又名 POSIX)的版本。 See here for the SUSv7.

(2)但是。这可能仍然不起作用,因为 getpagesize()是 BSD 特定的函数,如果您尝试在 POSIX 兼容模式下编译该文件,它实际上可能会被隐藏。

通常您不需要任何特殊的东西来访问 BSD 系统上的 BSD 函数,但可移植的方法是提供 _BSD_SOURCE 定义。

获取页面大小的更便携、符合 POSIX 标准的方法是 sysconf(_SC_PAGE_SIZE)功能。 FreeBSD man page .

附注手头没有 BSD 来测试它。

关于c - FreeBSD:隐式声明 getpagesize 并定义 _POSIX_C_SOURCE=200809L。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29797547/

相关文章:

java - 如何使用java设置执行位(s)权限的组ID

c++ - 使来自线程的数据流对所有其他线程可读

python - FreeBSD 上 Python 中的 psutil 错误

google-cloud-platform - 使用自定义 FreeBSD ISO 创建 Google Cloud 实例

C 代码在有断点的情况下运行良好,但在没有断点的情况下会崩溃

c - 数组指针错误?

c++ - 在链接时插入字符串

c - 手动单步执行 C 中的结构

linux - 如果 `so`代表共享对象,那么 `a`代表什么?

c - 使内核模块在运行时可加载