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

mon*_*ing 43 macros gcc 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

}
Run Code Online (Sandbox Code Playgroud)

dcp*_*dcp 50

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

  • 是的,`-U`只适用于在命令行中定义的宏.您无法取消定义CL中代码中定义的宏. (5认同)
  • @MarcW 此外,“-U”不仅适用于命令行上定义的宏,还适用于预定义的宏。这非常有用。我正在处理在 Termux 上编译代码的案例,其中“__ANDROID_API__”的内置定义为“24”无法显示实际上在标头中声明并可用于链接的函数。为了解决这个问题,我为该符号添加了“-U”,然后添加了“-D”以获得更高的值。如果没有“-U”,您会得到命令行正在以不同方式重新定义宏的诊断信息。 (2认同)

par*_*par 15

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

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif
Run Code Online (Sandbox Code Playgroud)

当你不想要MYDEF时,从命令行:

gcc -DDONT_DEFINE_MYDEF ...


jld*_*ont 10

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

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