マクロ名の有効な文字は何ですか?
-
21-08-2019 - |
質問
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に陥ります 広範なクラス:識別子、 前処理番号、文字列 リテラル、区切り子、およびその他。アン 識別子は同じです C内の識別子:の任意の配列 文字、数字、またはアンダースコア、どの 文字またはアンダースコアで始まります。 Cのキーワードには意味がありません プリプロセッサ;彼らは普通です 識別子。あなたは、マクロを定義することができます その名前は、例えば、キーワードです。 ことができる唯一の識別子 前処理キーワードであると考えられ
defined
。定義を参照してください。これは、他の言語のほとんどが真であります これはCプリプロセッサを使用します。しかしながら、 C ++のキーワードのいくつかはあります でも、プリプロセッサで重要。 C ++の名前付き演算子を参照してください。
1999 C規格では、識別子 一部ではない文字が含まれていてもよいです 「基本ソース文字セット」の、 実装の裁量で (例えばアクセント付きラテン文字のように、ギリシャ 文字、中国語の表意文字)。この 拡張文字で行うことができます セット、または
'\u'
と'\U'
脱出 シーケンス。このの実装 GCCでの機能は実験的なものです。そのような 文字だけで受け入れられています'\u'
と'\U'
フォームと場合にのみ、-fextended-identifiers
が使用されます。の拡張として、GCC扱いは、AS
'$'
文字。これは、との互換性のためであります このようVMS、'$'
などの一部のシステムでは、 一般的に使用されるシステム定義 機能やオブジェクト名。'$'
ではありません 厳密に準拠モードの手紙、 またはあなたが-$
オプションを指定した場合。見る 呼び出します。
他のヒント
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はこれこれまでのところ、私は失敗しました。対象上の任意の洞察力は、いただければ幸い™️ます。
そうだね、同じ規則は限り名前が懸念しているようなマクロと識別子に適用されます。有効な文字は[A-ZA-Z0-9_]です。
これは、他の識別子からのマクロを区別するために、大文字の名前を使用するのが一般的用法だ - 。変数や関数名
変数名のために有効な識別子を指定して同じ規則は、マクロがキーワードと同じ名前を持つことを除いて、マクロ名に適用されます。識別子名での有効な文字はdigits
とnon-digits
が含まれており、数字で始めることはできません。 non-digits
は大文字-Z、小文字-Z、アンダースコア、及び任意の実装定義された文字を含む。