回答:
あなたがするとき
#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) 。
以下も参照してください。
-D
プリプロセッサ変数を定義するCコンパイラオプションです。この場合_XOPEN_SOURCE
。
これは実際にはコンパイラ自体の動作には影響しませんが、一部のライブラリ(標準のcライブラリなど)の動作を変更します。このようないくつかのオプションがあります。ほとんどの場合、それらはUNIX固有のプログラミングインターフェースに関する標準ドキュメントや、特定のライブラリベンダーに関連しています。
一部の標準機能の動作やシグネチャでさえ標準間で異なる可能性があるため、それらの1つを定義することが必要になる場合があります。したがって-D_XOPEN_SOURCE
、互換モードをオンにするには、またはに似たものを使用する必要がある場合があります。
これらのフラグの別の可能な使用法は、Cライブラリ実装によって提供される拡張機能をオフにすることにより、ソースコードが特定の標準の制限内に留まるようにすることです。これは、コードができるだけ多くのプラットフォームで実行されるようにするために使用できる方法の1つです。