如何使用gcc在命令行中取消定义

时间:2009-12-30 02:48:40

标签: gcc macros c-preprocessor

如何在编译时使用gcc取消定义编译器宏。我尝试了一些编译args到gcc像-D但我无法看到“未定义”的消息。

由于

#include <iostream>

#define MYDEF


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

}

6 个答案:

答案 0 :(得分:48)

您可以将-U选项与gcc一起使用,但它不会取消定义源代码中定义的宏。据我所知,没有办法做到这一点。

答案 1 :(得分:14)

您应该将MYDEF定义包装在预处理器宏中,其存在(在命令行中定义)将阻止定义MYDEF。有点令人费解,但你可以从命令行(或Makefile)以你想要的方式控制构建。例如:

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif

然后从命令行开始,当你不想要MYDEF时:

gcc -DDONT_DEFINE_MYDEF ...

答案 2 :(得分:10)

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

-U选项看起来就像你可能需要的......但是你再次无法覆盖源代码中包含的定义而不需要使用更多的预处理程序指令。

答案 3 :(得分:3)

您可以使用过滤源代码并将其返回给gcc进行编译,就像这个伪代码一样:

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

希望它有所帮助。

答案 4 :(得分:1)

代码用例不对。我看,你在文件中有硬编码#define。如果编译器最初假定MYDEF未定义,则它将在开始处理文件时定义它。

您应该删除第#define MYDEF行。如果您将MYDEF传递给-D-U,我希望您的测试用例能够正常运行。

答案 5 :(得分:0)

这是一种不完全覆盖您的用例的可能性,但我认为这对我的情况有帮助。

如果您的MYDEF在.c文件中包含#included的单独头文件中#defined,则可以使用-D选项强制定义#include保护宏(从而阻止MYDEF 1}} #definition)然后主动#define(仍然使用-D选项)MYDEF到其他东西或者只是保持未定义。

很明显,头文件中定义的任何其他内容也会丢失,但这对我来说是一个强制取消定义宏而不更改第三方代码的解决方案。