コンパイル時にgccを使用してコンパイラマクロの定義を解除するにはどうすればよいですか。 -Dのようにgccにいくつかのコンパイル引数を試しましたが、「未定義」メッセージが表示されません。
ありがとう
#include <iostream>
#define MYDEF
int main(){
#ifdef MYDEF
std::cout<<"defined\n";
#else
std::cout<<"not defined\n";
#endif
}
Gccで-Uオプションを使用できますが、ソースコードで定義されているマクロの定義を解除することはありません。私の知る限り、それを行う方法はありません。
MYDEF
定義をプリプロセッサマクロでラップする必要があります。これが存在すると(コマンドラインで定義される)、MYDEFが定義されなくなります。確かに少し複雑ですが、コマンドライン(またはMakefile)から希望する方法でビルドを制御できます。例:
#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif
次に、MYDEFが不要な場合のコマンドラインから:
gcc -DDONT_DEFINE_MYDEF ...
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Preprocessor-Options.html#Preprocessor-Options
-U
オプションは必要なもののように見えました...しかし、この場合も、ソースコードに含まれる定義を、より多くのプリプロセッサディレクティブに頼らずにオーバーライドすることはできません。
この擬似コードのように、ソースコードをフィルタリングして、コンパイルのためにこれをgccに返すことができます。
grep -v "define MYDEF" yourFile.c | gcc -o yourFile.o -xc -
それが役に立てば幸い。
コードの使用例は正しくありません。ご覧のとおり、ファイルに#define
がハードコーディングされています。コンパイラが最初にMYDEF
が未定義であると想定している場合、ファイルの処理を開始するとコンパイラが定義します。
行#define MYDEF
を削除する必要があります。 MYDEF
を-D
と-U
に渡すと、テストケースが機能することを願っています。
ユースケースを完全にカバーしていない可能性が1つありますが、私の場合に役立ちます。
MYDEF
が#c別のヘッダーファイルで#defineされている場合、-D
オプションを使用して#includeガードマクロの定義を強制できます(したがって、MYDEF
#definition)その後、積極的に#define(-D
オプションを使用)MYDEF
を他のものに変更するか、未定義のままにします。
ヘッダーファイルで定義されている他のものもすべて欠落していることは明らかですが、これはサードパーティのコードを変更せずに強制的にマクロの定義を解除するソリューションでした。