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

问题描述 投票:0回答:6

如何在编译时使用 GCC 取消定义编译器宏?我尝试了一些 GCC 的编译参数,例如 -D,但我看不到“未定义”消息。

#include <iostream>

#define MYDEF


int main(){

#ifdef MYDEF
  std::cout << "defined\n";
#else
  std::cout << "not defined\n";
#endif

}
gcc macros c-preprocessor
6个回答
69
投票

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


21
投票

您应该将

MYDEF
定义包装在预处理器宏中,该宏的存在(在命令行上定义)将阻止定义 MYDEF。确实有点复杂,但您可以从命令行(或 Makefile)以您想要的方式控制构建。示例:

#ifndef DONT_DEFINE_MYDEF
#define MYDEF
#endif

然后当您不需要 MYDEF 时从命令行:

gcc -DDONT_DEFINE_MYDEF ...


13
投票

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

-U
选项似乎是您可能需要的...但是话又说回来,您无法在不诉诸更多预处理器指令的情况下覆盖源代码中包含的定义。


4
投票

你可以通过过滤源代码并将其返回给gcc进行编译,就像这样的伪代码:

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

希望有帮助。


1
投票

代码用例不正确。正如我所见,您在文件中硬编码了

#define
。如果编译器最初假设
MYDEF
未定义,一旦开始处理文件就会定义它。

您应该删除该行

#define MYDEF
。如果您通过
MYDEF
-D
-U
,我希望您的测试用例能够发挥作用。


0
投票

这是一种可能并不能完全涵盖您的用例,但我发现它对我的案例很有帮助。

如果您的

MYDEF
是在.c文件中#included的单独头文件中#定义的,您可以使用
-D
选项强制定义#include保护宏(从而防止
MYDEF
#definition),然后积极#define(仍然使用
-D
选项)
MYDEF
到其他东西,或者只是将其保留为未定义。

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

© www.soinside.com 2019 - 2024. All rights reserved.