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」のようなものに変更する必要があると思いますか?
マクロ名は英数字とアンダースコア('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などの一部のシステムとの互換性のためです。ここで、'$'
は、システム定義の関数名とオブジェクト名で一般的に使用されます。'$'
は、厳密に準拠するモードの場合、または-$
オプションを指定した場合、文字ではありません。呼び出しを参照してください。
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はこれまでのところ、私を失敗させています。この件に関する洞察は、いただければ幸いです™️。
そうです、名前に関する限り、同じルールがマクロと識別子に適用されます。有効な文字は[A-Za-z0-9_]です。
CAPITALIZED名を使用してマクロを他の識別子(変数と関数名)と区別するのが一般的な使用方法です。
変数名に有効な識別子を指定するのと同じルールがマクロ名に適用されますが、マクロはキーワードと同じ名前を持つ場合があります。識別子名の有効な文字にはdigits
およびnon-digits
が含まれ、数字で始めることはできません。 non-digits
には、大文字のA-Z、小文字のa-z、アンダースコア、および実装で定義された文字が含まれます。