web-dev-qa-db-ja.com

マクロ名に有効な文字は何ですか?

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」のようなものに変更する必要があると思いますか?

43
An̲̳̳drew

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

GCCドキュメント から:

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

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

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

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

38
Adam Rosenfield

clangは、多くの「クレイジー」キャラクターを許可します。 どれか 多くの韻または理由-whysomeについては許可され、その他はnotです。例えば..

#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はこれまでのところ、私を失敗させています。この件に関する洞察は、いただければ幸いです™️。

11
Alex Gray

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

CAPITALIZED名を使用してマクロを他の識別子(変数と関数名)と区別するのが一般的な使用方法です。

8
philant

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

1
Robert Gamble