1

コード内の古いマクロを削除するプロセスでは、意味のあるコンパイラメッセージを含むエラーとして古いマクロを定義する必要があります。

例:古いコード:

#define DIVIDE_BY_TWO(x) x/2

新しいコードでは、このマクロの使用を防ぐために、次のように記述します。

#define DIVIDE_BY_TWO(x) #error DIVIDE_BY_TWO is obsolete, use DIV_2 instead

しかし、上記の行をコンパイルすると、次のようになります。

error C2162: expected macro formal parameter

それを行う正しい方法は何ですか?

4

3 に答える 3

1

使用の問題#errorは、コードの一部がプリプロセッサによって分析されるときにエラーが発生することです。マクロが展開されたときにエラーを作成したい。残念ながら、そのために使用することはできません#error

ポータブルCで人間が読める形式の明確なエラーメッセージを確実に生成する方法はないと思います(もちろん、マクロを構文的に無効なものに展開することはできますが、少なくともコンパイルは停止します)。 gccは。でそれを行うことをサポートし_Pragmaます。あなたの質問は事実上この質問と同等であり、そこでの答え_Pragmaは致命的なエラーを作成するための使用方法と他のオプションを説明しています。

于 2013-03-18T07:24:12.280 に答える
1

マクロはディレクティブを持つことも、プリプロセッサの状態を変更することもできません。未定義のままにしておくこともできますがDIVIDE_BY_TWO、そうすると、置換マクロを見つけるのに役立ちません。移植可能にする唯一の方法は、次のように定義することです。

#define DIVIDE_BY_TWO error_DIVIDE_BY_TWO_is_obsolete_use_DIV_2_instead

定義されていないエラーが発生するはずでerror_DIVIDE_BY_TWO_is_obsolete_use_DIV_2_insteadあり、うまくいけば、それを置き換える方法について十分なヒントが得られるはずです。

于 2013-03-19T04:22:00.493 に答える
0

#defineプリプロセッサを 2 回実行する必要があるため、プリプロセッサ ディレクティブを使用することはできません。

行が で始まる場合、#それはプリプロセッサへの指示であり、解釈されます。そうでない場合は、マクロの置換と、そのようなマクロが存在する場合の置換の対象となります。

あなたができる最善の方法は、非推奨のマクロを、確実にエラーを返す式として定義することです。

于 2013-03-18T07:28:27.413 に答える