如何使用gcc在命令行中取消定义define
如何在编译时使用gcc取消定义编译器宏。我尝试了一些编译参数到gcc,比如-D,但是我看不到“notdefined”消息 谢谢如何使用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
#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对于生产代码,您应该正确地清理第三方代码,但对于通过抑制第三方代码来提高分支覆盖率的单元测试,我无法影响,但代码覆盖率工具会考虑到这一点,因为它们是宏。因此进行了调整。