#undef
MISRA 規則で、プログラムでの使用が禁止されているのはなぜですか? マクロの範囲を制限したい場合、使用せずにそれを行うにはどうすればよい#undef
ですか?
3 に答える
基本的に、MISRA は偏執的すぎて、プログラマーが何をしているかを知ることを信頼していないためです :-) 真剣に、MISRA は特定のエラーを防止しようとし、潜在的に問題のあるコード構成を禁止すると、ソフトウェアの信頼性が突然向上するという信念に導かれています。 . それが本当かどうかは議論の問題です。の場合#undef
、考えられる理由は、マクロが定義されると、その展開が置かれたままになり、常にその定義からのものになるためです。を許可する#undef
と、識別子は、変数、関数名、typedef、または構造体/共用体のメンバーとして、あるいはあえぎ、異なる展開を持つマクロとしても再利用できます。必要に応じて、識別子のシャドーイングを防ぐための何らかの方法です。怖いですね!あなたが決める!
2 番目の質問に答えるには、#undef
使用できない場合にマクロのスコープを制限する唯一の方法は、ファイルの終わりを使用することです。これは、マクロのスコープを終了するための他の唯一の標準定義された方法です。つまり、ソース ファイルを小さなファイルに分割し、必要な特定のファイルをコンパイルするときにのみマクロを定義する必要があります。
#undef
MISRA は、 の使用が禁止されている理由について独自の説明をしています。
#undef は通常必要ありません。これを使用すると、マクロがコード内で使用されるときに、マクロの存在または意味に関して混乱が生じる可能性があります。
上記の@Bubbleのコメントへの返信:
これについて例を挙げてください。それがどのように混乱を引き起こすか想像できませんか?
シナリオを想像してください...
#define MACRO some-definition
.
.
MACRO // Invocation 1
.
.
MACRO // Invocation 2
.
.
そして、誰かがやって来て、MACRO の既存の呼び出しの間に挿入します。
.
.
#undef MACRO
#define MACRO something-else
MACRO // Between (1) and (2)
.
.
MACRO の元の 2 番目の呼び出しは、期待どおりに動作しません。