2

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
4

1 に答える 1

3

__USE... マクロは内部使用のためのものです。_POSIX_SOURCE を定義するか、feature.h のコメントに記載されている他の機能マクロの 1 つを定義する必要があります。

   __STRICT_ANSI__  ANSI Standard C.
   _POSIX_SOURCE    IEEE Std 1003.1.
   _POSIX_C_SOURCE  If ==1, like _POSIX_SOURCE; if ==2 add IEEE Std 1003.2.
   _BSD_SOURCE      ANSI, POSIX, and 4.3BSD things.
   _SVID_SOURCE     ANSI, POSIX, and SVID things.
   _GNU_SOURCE      All of the above, plus GNU extensions.

したがって、_GNU_SOURCE を定義すると、すべてが得られます。

編集:キース・トンプソンのコメントから、必要です

 #define _POSIX_C_SOURCE 200809L

ストラダップ用。

于 2012-09-25T02:05:05.167 に答える