4
#if defined(__STDC__) || defined(__cplusplus)
#define __P(protos) protos      /* full-blown ANSI C */
#define __CONCAT(x,y)   x ## y
#define __STRING(x) #x


 #define    __unused    __attribute__((__unused__))
 #define    __dead2     __attribute__((__noreturn__))
 #define    __pure2     __attribute__((__const__))
  1. なにprotos?それはどこで定義されていますか?
  2. なに#x
  3. すでに存在している__unusedのになぜ必要なのですか?__unused__
  4. __const__、 、はどこ__noreturn____unused__定義されていますか?
4

2 に答える 2

9
  1. protosマクロパラメータです。で定義され__P(protos)、そのスコープは行末までです。この場合、マクロ呼び出しは、必ずしも関数パラメーターを宣言しない標準化前の C とは対照的に、「ANSI スタイル」の関数プロトタイプであるint func(__P(int foo))に置き換えられます。int func(int foo)このような標準化前のコンパイラでは、マクロは展開なしで定義されるため、コンパイラはint func().

  2. #x文字列化演算子です。x引用符を追加して、引数の内容を文字列に変換します。に渡された引数xにマクロが含まれている場合、それらは文字列変換が行われる前に展開されません。

  3. これらのマクロは、プラットフォームごとに異なるものを定義するために使用されます。__unusedGCC または MSVC でさまざまなものに拡張される可能性があります。

  4. それらはコンパイラ内部へのフックです。ヘッダー ファイルは、コンパイラの内部構造と標準言語の間のインターフェイスを提供します。コンパイラは__unused拡張キーワードとして直接動作する可能性がありますが、その作成者は__attribute__.

于 2013-09-11T06:43:49.207 に答える
4
  1. protos__P渡されたばかりのパラメーターです。
  2. #xから文字列を作成することを意味しますx__STRING(abc)に置き換えられます"abc"
  3. おそらくメンテナンス、クロスプラットフォーム、または統一性の理由です。文脈がないとわかりにくい。
  4. コンパイラ拡張。コンパイラのドキュメントを参照してください。
于 2013-09-11T06:42:40.327 に答える