3

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

我创建了一个小测试程序

#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(我在代码的其他部分需要的正确 POSIXgetline函数定义的结果)我得到:

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(); 
                ^

尽管我unistd.h按照getpagesize. 如何在仍然定义的情况下使代码编译没有警告_POSIX_C_SOURCE

4

1 回答 1

2

(1)_POSIX_C_SOURCE是错误的定义。你需要_XOPEN_SOURCE. 例如:

cc -D_XOPEN_SOURCE=700 test.c 

或者

cc -D_XOPEN_SOURCE=600 test.c 

600和表示您的700应用程序期望从系统库中获得的单一 Unix 规范(简称 SUS,又名开放组规范,又名 POSIX)的版本。有关 SUSv7,请参见此处。

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

通常你不需要什么特别的东西来访问 BSD 系统上的 BSD 功能,但可移植的方式是提供_BSD_SOURCE定义。

获取页面大小的更便携、符合 POSIX 的方法是 sysconf(_SC_PAGE_SIZE)函数。FreeBSD 手册页

PS手头没有BSD来测试它。

于 2015-04-22T12:47:58.700 回答