StackOverflow のコード サンプルで strdup が使用されているのを確認し、Linux (3.0.0-21-generic x86_64) で使用しようとしました。
コンパイラ (clang) はそれが string.h にあることを認識していましたが、string.h が含まれていてもプロトタイプがないことに不満を漏らしていました。strdup は、string.h で定義された #if にラップされていることがわかります。このサイトを検索したところ、strdup はC 標準ライブラリ ルーチンではなくPOSIXルーチンであるという投稿が見つかりました。
それを公開する可能性のあるマクロは次のとおりです。
- __USE_SVID
- __USE_BSD
- __USE_XOPEN_EXTENDED
- __USE_XOPEN2K8
これらのそれぞれは、stdlib.h に含まれる features.h では定義されていません。
そのリストに POSIX マクロがないのはなぜですか? また、string.h で strdup を公開するために使用されているマクロ/コンパイラ スイッチはどれですか?
編集:以下のジムのコメントによると、
#define _POSIX_SOURCE 1
また
#define _POSIX_C_SOURCE 1
その上
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
システムで strdup を公開しないでください。
しかし、これらは次のことを行います。
#define _BSD_SOURCE 1
#define _SVID_SOURCE 1
編集 2: Keith のコメントによると、これも機能することがわかりました。
#define _POSIX_C_SOURCE 200809L
編集3:ジョナサンのコメントによると、これらも機能します
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700