-D_XOPEN_SOURCEは何を意味しますか?


103

最近、この引数がないとgccがコンパイルできないコードに遭遇しました。gccのmanページを確認しましたが、この特定のオプションは見つかりませんでした。私は見つけましたがXOPEN_SOURCE、それが何をするのかほとんど説明がありませんでした。

誰かが詳しく説明してもらえますか?私が知っている-D_XOPEN_SOURCEように、異なる値に設定することができ400600しかし、それらは何をしますか?

回答:


132

あなたがするとき

#define _XOPEN_SOURCE <some number>

または

cc -D_XOPEN_SOURCE=<some number>

X / OpenおよびPOSIX標準で定義されているいくつかの追加関数の定義を含めるようコンパイラーに指示します。

これにより、最新のUNIX / BSD / Linuxシステムに存在するいくつかの追加機能が提供されますが、Windowsなどの他のシステムには存在しない可能性があります。

番号は規格の異なるバージョンを参照しています。

呼び出す各関数のマニュアルページを参照することで、必要な場合(ある場合)を判別できます。

たとえば、man strdup言う:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

つまり、次のいずれかを配置する必要があります。

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700

#includeを使用する場合は、sを実行する前にソースファイルの先頭に置きますstrdup

またはあなたが置くことができます

#define _GNU_SOURCE

代わりに、Solaris、FreeBSD、Mac OS Xなどでコンパイルできない可能性があるという欠点があるため、すべての機能が有効になります。

これは、実行する前に、各manページをチェックすることをお勧めします#include#define時には彼らの行動がどのようなオプションとに応じて変化するため、または新しい機能を使って#define、あなたが持っているよ、と例えばベース名(3)

以下も参照してください。


4
これらの言語方言の定義にとって「ソースファイルの先頭」がいかに重要であるかを強調するコメントです。それらが最上部にない場合、それらは機能しません。
パーソンパーソンII

6

-Dプリプロセッサ変数を定義するCコンパイラオプションです。この場合_XOPEN_SOURCE

これは実際にはコンパイラ自体の動作には影響しませんが、一部のライブラリ(標準のcライブラリなど)の動作を変更します。このようないくつかのオプションがあります。ほとんどの場合、それらはUNIX固有のプログラミングインターフェースに関する標準ドキュメントや、特定のライブラリベンダーに関連しています。

一部の標準機能の動作やシグネチャでさえ標準間で異なる可能性があるため、それらの1つを定義することが必要になる場合があります。したがって-D_XOPEN_SOURCE、互換モードをオンにするには、またはに似たものを使用する必要がある場合があります。

これらのフラグの別の可能な使用法は、Cライブラリ実装によって提供される拡張機能をオフにすることにより、ソースコードが特定の標準の制限内に留まるようにすることです。これは、コードができるだけ多くのプラットフォームで実行されるようにするために使用できる方法の1つです。


3

これにより、posixなどの特定の規範の定義に属するヘッダーが公開されます。それが属する実際のノルムは、値(ここでは、たとえば400または600)によって定義されます。ノルムと値のバインディングについては、このリファレンスを参照してください。


1

不明な理由により、Mac OS / X(XCode)では、1995年の仕様であるにもかかわらず、strdup()を定義するために600が必要です。Mozillaや他の人たちはこれに遭遇しました...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.