3

私は現在、ソフトウェア プロジェクトの OS 関連機能を Linux から FreeBSD に移植しています。これにより、 FreeBSD 10.1 で定義されているgetpagesizeif を使用して、次の問題を認識しました。_POSIX_C_SOURCE=200809L

小さなテストプログラムを作成しました

#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の適切な POSIX 定義の結果)、次のようになります。getline

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 

アプリケーションがシステム ライブラリから期待する Single Unix 仕様 (略して SUS、別名 Open Group 仕様、別名 POSIX) のバージョンを意味します600SUSv7についてはこちらをご覧ください。700

(2) しかし。これはgetpagesize()BSD固有の関数であり、POSIX準拠モードでファイルをコンパイルしようとすると実際には隠されている可能性があるため、それでも機能しない可能性があります。

通常、BSD システムで BSD 関数にアクセスするために特別なことは何も必要ありませんが、移植可能な方法は_BSD_SOURCE定義を提供することです。

ページ サイズを取得するためのより移植性の高い POSIX 準拠の方法は、 sysconf(_SC_PAGE_SIZE)関数です。FreeBSD のマニュアルページ

PS テストするための BSD は手元にありません。

于 2015-04-22T12:47:58.700 に答える