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

如何使用gcc在命令行中取消定义define,gcc,macros,c-preprocessor,Gcc,Macros,C Preprocessor,如何在编译时使用gcc取消定义编译器宏。我尝试了一些编译参数到gcc,比如-D,但是我看不到“notdefined”消息 谢谢 #include <iostream> #define MYDEF int main(){ #ifdef MYDEF std::cout<<"defined\n"; #else std::cout<<"not defined\n"; #endif } #包括 #定义MYDEF int main(){ #ifdef M

如何在编译时使用gcc取消定义编译器宏。我尝试了一些编译参数到gcc,比如-D,但是我看不到“notdefined”消息

谢谢

#include <iostream>

#define MYDEF


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

}
#包括
#定义MYDEF
int main(){
#ifdef MYDEF
标准::cout


-U
选项似乎是您所需要的…但是,如果不使用更多的预处理器指令,您无法覆盖源代码中包含的定义。

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

> 代码用例不正确。如我所见,您在文件中硬编码了
#define
。如果编译器最初假定
MYDEF
未定义,它将在开始处理文件时定义它


您应该删除行
#define MYDEF
。我希望您的测试用例能够工作,如果您将
MYDEF
传递给
-D
-U
,您应该将
MYDEF
定义包装在预处理器宏中,该宏的存在(在命令行上定义)然后将阻止定义MYDEF。确实有点复杂,但您可以通过命令行(或Makefile)控制生成。示例:

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif
然后在不需要MYDEF时从命令行执行以下操作:


gcc-DDONT\u DEFINE\u MYDEF…

您可以过滤源代码并将其返回给gcc进行编译,如以下伪代码:

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

希望能有所帮助。

这里有一种可能性并没有完全涵盖您的用例,但我发现它对我的用例很有帮助

如果您的
MYDEF
是在一个单独的头文件中定义的#包含在.c文件中,您可以使用
-D
选项强制定义#include guard宏(从而阻止
MYDEF
#定义),然后要么主动定义(仍然使用
-D
选项)
MYDEF
添加到其他内容,或者不定义它


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

是的,
-U
仅适用于命令行中定义的宏。您不能从CL中取消定义代码中定义的宏。请注意我的用例:I'm n对于生产代码,您应该正确地清理第三方代码,但对于通过抑制第三方代码来提高分支覆盖率的单元测试,我无法影响,但代码覆盖率工具会考虑到这一点,因为它们是宏。因此进行了调整。