【问题标题】:FreeBSD: Implicit declaration of getpagesize with _POSIX_C_SOURCE=200809L defined.FreeBSD:定义了 _POSIX_C_SOURCE=200809L 的 getpagesize 的隐式声明。
【发布时间】:2015-06-30 02:38:18
【问题描述】:

我目前正在将软件项目的一些与操作系统相关的功能从 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 使代码编译没有警告?

【问题讨论】:

    标签: c posix freebsd posix-api


    【解决方案1】:

    (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 来测试它。

    【讨论】:

    • 我尝试用 _XOPEN_SOURCE=500 替换 _POSIX_C_SOURCE 并且它有效。但是使用与 POSIX 2001/2008 标准相对应的 _XOPEN_SOURCE=600/700 会再次弹出相同的警告。通过sysconf 替换它是一种解决方法,它不能解决问题的原因。
    • sysconf() 不是解决方法。它是 POSIX 的一部分 - getpagesize() 不是。如果你想要/需要 POSIX,那么你必须使用 sysconf()
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2018-06-11
    • 2019-07-31
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多