web-dev-qa-db-ja.com

gccを使用してコマンドラインで定義を未定義にする方法

コンパイル時にgccを使用してコンパイラマクロの定義を解除するにはどうすればよいですか。 -Dのようにgccにいくつかのコンパイル引数を試しましたが、「未定義」メッセージが表示されません。

ありがとう

#include <iostream>

#define MYDEF


int main(){
#ifdef MYDEF
  std::cout<<"defined\n";
#else
  std::cout<<"not defined\n";
#endif

}
42
monkeyking

Gccで-Uオプションを使用できますが、ソースコードで定義されているマクロの定義を解除することはありません。私の知る限り、それを行う方法はありません。

48
dcp

MYDEF定義をプリプロセッサマクロでラップする必要があります。これが存在すると(コマンドラインで定義される)、MYDEFが定義されなくなります。確かに少し複雑ですが、コマンドライン(またはMakefile)から希望する方法でビルドを制御できます。例:

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif

次に、MYDEFが不要な場合のコマンドラインから:

gcc -DDONT_DEFINE_MYDEF ...

14
par

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Preprocessor-Options.html#Preprocessor-Options

-Uオプションは必要なもののように見えました...しかし、この場合も、ソースコードに含まれる定義を、より多くのプリプロセッサディレクティブに頼らずにオーバーライドすることはできません。

10
jldupont

この擬似コードのように、ソースコードをフィルタリングして、コンパイルのためにこれをgccに返すことができます。

grep -v "define MYDEF" yourFile.c | gcc -o yourFile.o -xc -

それが役に立てば幸い。

3
xryl669

コードの使用例は正しくありません。ご覧のとおり、ファイルに#defineがハードコーディングされています。コンパイラが最初にMYDEFが未定義であると想定している場合、ファイルの処理を開始するとコンパイラが定義します。

#define MYDEFを削除する必要があります。 MYDEF-D-Uに渡すと、テストケースが機能することを願っています。

1
Pankaj Saraf

ユースケースを完全にカバーしていない可能性が1つありますが、私の場合に役立ちます。

MYDEFが#c別のヘッダーファイルで#defineされている場合、-Dオプションを使用して#includeガードマクロの定義を強制できます(したがって、MYDEF #definition)その後、積極的に#define(-Dオプションを使用)MYDEFを他のものに変更するか、未定義のままにします。

ヘッダーファイルで定義されている他のものもすべて欠落していることは明らかですが、これはサードパーティのコードを変更せずに強制的にマクロの定義を解除するソリューションでした。

0
Roland Sarrazin