【问题标题】:A way to have GCC poison only apply to the source and not command line?让 GCC 中毒的方法仅适用于源代码而不适用于命令行?
【发布时间】:2014-06-24 14:43:54
【问题描述】:

我有一个已清除所有 PLATFORM_X ifdefs 的文件,目的是保持这种状态,使其独立于平台。

所以我在源代码中添加了以下内容,以鼓励人们不要再使用 ifdef PLATFORM_X 添加任何技巧

#pragma GCC poison PLATFORM_X

#ifdef PLATFORM_X // compiler catches when a dev tries to add more hacky code
// bla bla 
#endif

但是,由于文件本身是使用 -DPLATFORM_X 与该平台的所有其他文件一起编译的,因此会触发警告。

./foo.c:3:20: error: poisoning existing macro "PLATFORM_X"

我真的希望毒药只触发源文件中的添加。这可能吗?

(在这种情况下修改 makefile 并不理想,因为这确实是一个全局定义)

另一种方法是在有毒头文件中使用#undef PLATFORM_X,但这样代码只是默默地省略而不是出错。

想法?

【问题讨论】:

  • 你的意思是#ifdef PLATFORM_X, #undef PLATFORM_X, #endif, #pragma GCC posion PLATFORM_X 不起作用吗?我不明白为什么它不会?当然,如果 Makefile 定义了它,它就不会捕获它,因为我们只是取消了它。与完全没有定义时相比,上述内容有什么区别?
  • 是的,这行得通!好主意。
  • Np,很高兴为您提供帮助。将其发布为答案。

标签: c gcc c-preprocessor


【解决方案1】:

这应该可行:

#ifdef PLATFORM_X
#undef PLATFORM_X
#endif
#pragma GCC poison PLATFORM_X

(如果您愿意,请跳过#ifdef,但我只是喜欢明确地看待事物,见仁见智)。

当然,如果 Makefile 定义了它,它就不会捕获,因为我们只是未定义它。上面和根本没有定义的时候应该没有区别。

【讨论】:

  • 我想这更多是对我的观察而不是风格,但是当我看到 #ifndef-wrapped #undef 我的反应是“如果你认为你不知道语言是如何工作的你需要那个。”
  • 我理解您的观点,但是我在整个工作过程中使用了几种不同的语言,它们的行为都不同。即使对于最有经验的人来说,在这种情况下也很容易误读或“中途上下文切换”导致问题。我认为它根本没有伤害,它只是非常具体并明确地表明了您的意图。 (我认为冗余有时是愚蠢的。)一个容易错过的快速示例:从 C 到 shell 脚本,function(){ time= newtime=60 ...}
【解决方案2】:

我更喜欢这样的单元测试。在您的情况下,编写一个读取 .h 文件并搜索 PLATFORM_ 的单元测试。如果你找到任何这样的字符串,失败。

【讨论】:

    【解决方案3】:

    在清除了#ifdef PLATFORM_X的文件中,不需要定义PLATFORM_X,所以写

    /* PLATFORM_X configuration macro is deprecated; do not add new uses. */
    #undef PLATFORM_X
    #pragma GCC poison PLATFORM_X
    

    在包含任何可能仍然使用宏的头文件之后。

    请注意,您从不需要将#undef 包装在#ifdef 中; #undef 如果应用于已经不是宏的标识符,则静默无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 2016-03-31
      • 2015-07-11
      • 1970-01-01
      • 2014-07-02
      相关资源
      最近更新 更多