【问题标题】:How to undefine a define at commandline using gcc如何使用 gcc 在命令行取消定义
【发布时间】:2010-12-30 23:49:58
【问题描述】:

如何在编译时使用 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


    【解决方案1】:

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

    【讨论】:

    • 是的,-U 仅适用于也在命令行中定义的宏。您不能取消定义在 CL 代码中定义的宏。
    • @MarcW 该要求甚至没有任何意义,因为命令行上的(未)定义被理解为在程序文本之前。因此,这就像希望第 16 行的 #undef 中和第 42 行的宏一样。
    • @MarcW 此外,-U 不仅适用于在命令行上定义的宏,而且适用于预定义的宏。这非常有用。我正在处理 Termux 上的一个案例编译代码,其中 __ANDROID_API__ 的内置定义为 24 未能显示实际上在标题中声明且可用于链接的函数。为了解决这个问题,我为此符号设置了 -U,然后将 -D 设置为更高的值。如果没有-U,您会得到命令行以不同方式重新定义宏的诊断信息。
    【解决方案2】:

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

    #ifndef DONT_DEFINE_MYDEF
    #define MYDEF
    #endif
    

    然后在你不想要 MYDEF 时从命令行:

    gcc -DDONT_DEFINE_MYDEF ...

    【讨论】:

      【解决方案3】:

      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 -
        

        希望对你有帮助。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            如果您的MYDEF 是在单独的头文件中#defined 来自.c 文件#included,您可以使用-D 选项强制定义#include 保护宏(从而防止MYDEF #definition)然后要么主动#define(仍然使用-D 选项)MYDEF 到别的东西,要么就让它未定义。

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

            【讨论】:

            • 请注意我的用例:我不是为生产代码执行此操作 - 您应该正确清理第三方代码 - 但对于单元测试,通过抑制第三方来提高分支覆盖率我无法影响代码,但代码覆盖率工具会考虑这些代码,因为这些是宏。因此进行了调整。
            猜你喜欢
            • 2011-01-25
            • 1970-01-01
            • 1970-01-01
            • 2015-02-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-19
            • 1970-01-01
            相关资源
            最近更新 更多