0

次のプリプロセッサマクロ:

#define _VARIANT_BOOL /##/

実際には有効ではありませんC ; 大まかに言えば、その理由は、プリプロセッサがトークンのストリームで動作するように定義されているのに対し、上記は文字のストリームで動作することを前提としているためです。

一方、残念ながら、上記は実際にはMicrosoftヘッダーファイルで発生するため、とにかく処理する必要があります。(私はプリプロセッサの実装に取り​​組んでいます。)

人々が実際に遭遇した他のケースは、レガシーコードであるかどうか、そのコードがまだ使用されている限り古いものであるかどうか、実際には有効ではないが、文字を使用するコンパイラで記述されているため、とにかく動作するプリプロセッサマクロです。指向のプリプロセッサ実装?

(理論的根拠:適切でクリーンな標準準拠のトークン指向の実​​装を作成した場合、ハッキングする必要のある特殊なケースの数を事前に把握しようとしています。)

4

1 に答える 1

0

規格の関連部分は次のように(§6.10.3.3 The ## operator)述べています。

結果が有効な前処理トークンでない場合、動作は未定義です。

これは、プリプロセッサが好きなことを何でも実行でき、一般的な動作をエミュレートすることを含め、標準に準拠していることを意味します。

##演算子の結果が有効な前処理トークンでない場合、結果は2つのオペランドトークンが変更されないように指定することで、「トークンベース」の実装を維持し、この動作をサポートできると思います。また、プリプロセッサに無効なコードに関する警告を出力させることもできます。

于 2011-10-17T06:28:50.097 に答える