1. ホーム
  2. c

[解決済み] マクロ名に有効な文字は何ですか?

2022-02-03 02:48:19

質問事項

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' エスケープ というシーケンスがあります。この実装は の機能は実験的なものであり、このような 文字が受け入れられるのは '\u''\U' を形成し、かつ、その場合のみ -fextended-identifiers が使用されます。

拡張機能として、GCCは '$' として 文字になります。との互換性を保つためです。 VMSのような、一部のシステムで '$' は、システムで定義された 関数とオブジェクトの名前です。 '$' は は、厳密には適合するモードの文字です。 を指定した場合、または -$ オプションで指定します。参照 呼び出すことができます。