49

C スタイルのマクロ名は、識別子と同じ命名規則に従いますか? コンパイラのアップグレード後、レガシー アプリケーションに対して次の警告が出力されるようになりました。

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
  #define         CHAR_&        38

このコード行は、アンパサンドの ASCII 値定数を定義しています。

#define   DOL_SN        36
#define   PERCENT       37
#define   CHAR_&        38
#define   RT_SING       39
#define   LF_PAR        40

この定義(私が知る限り、実際にはどのコードでも参照されていません)はバグが多く、「CHAR_AMPERSAND」のようなものに変更する必要があると思いますか?

4

4 に答える 4

44

マクロ名は、英数字とアンダースコア、つまり、、、、およびのみで構成する必要があり'a-z'、最初の文字は数字であってはなりません。一部のプリプロセッサはドル記号文字も許可しますが、使用しないでください。残念ながら、C規格のコピーを持っていないため、C規格を引用することはできません。'A-Z''0-9''_''$'

GCCドキュメントから:

前処理トークンは、識別子、前処理番号、文字列リテラル、句読点などの5つの大きなクラスに分類されます。識別子はCの 識別子と同じです。文字、数字、またはアンダースコアのシーケンスで、文字またはアンダースコアで始まります。Cのキーワードは、プリプロセッサにとって重要ではありません。それらは通常の識別子です。たとえば、名前がキーワードであるマクロを定義できます。前処理キーワードと見なすことができる唯一の識別子は definedです。定義済みを参照してください。

これは、Cプリプロセッサを使用する他の言語にほとんど当てはまります。ただし、C ++のキーワードのいくつかは、プリプロセッサでも重要です。C++名前付き演算子を参照してください。

1999 C標準では、識別子には、実装の裁量により、「基本ソース文字セット」の一部ではない文字(アクセント付きラテン文字、ギリシャ文字、漢字など)が含まれる場合があります。これは、拡張文字セット、またはエスケープシーケンスを使用し'\u'て実行できます。'\U'GCCでのこの機能の実装は実験的なものです。このような文字は、 '\u'および'\U'フォームで のみ受け入れられ、-fextended-identifiersが使用されている場合にのみ受け入れられます。

拡張機能として、GCCは'$'文字として扱います。'$' これは、システム定義の関数名やオブジェクト名で一般的に使用されるVMSなどの一部のシステムとの互換性のためです。'$'厳密に準拠したモードの文字、または-$オプションを指定した場合の文字ではありません。呼び出しを参照してください。

于 2008-12-15T20:02:23.957 に答える
16

clang多くの「狂った」文字を許可します..なぜ一部が許可され、他の人が許可されないのかについて、韻や理由を見つけるに苦労しました. 例えば..

#define   ?:          /// WORKS FINE
#define  ■  @end        /// WORKS FINE
#define   @interface  /// WORKS FINE
#define P  @protocol   /// WORKS FINE

まだ

#define ☎   TEL     /// ERROR: Macro name must be an identifier.
#define ❌   NO     /// ERROR: Macro name must be an identifier.
#define ⇧   UP      /// ERROR: Macro name must be an identifier.
#define 〓   ==     /// ERROR: Macro name must be an identifier.
#define   APPLE   /// ERROR: Macro name must be an identifier.

知るか。 私はそうしたいと思っています...しかし、これまでのところ、Googleは私を失敗させてきました。この件に関する洞察をいただければ幸いです™️。

于 2015-12-16T14:57:26.033 に答える
8

そうです、名前に関する限り、同じルールがマクロと識別子に適用されます。有効な文字は[A-Za-z0-9_]です。

マクロを他の識別子(変数や関数名)と区別するために、大文字の名前を使用するのが一般的な使用法です。

于 2008-12-15T20:06:26.057 に答える
1

マクロがキーワードと同じ名前を持つ場合があることを除いて、変数名に有効な識別子を指定する同じ規則がマクロ名に適用されます。識別子名の有効な文字には、数字が含まdigitsnon-digits、数字で始まることはできません。 non-digits大文字のAZ、小文字のaz、アンダースコア、および実装で定義された文字を含めます。

于 2008-12-15T20:07:59.203 に答える