【问题标题】:Ignoring or redefining GCC Standard Predefined Macros忽略或重新定义 GCC 标准预定义宏
【发布时间】:2014-01-02 21:14:36
【问题描述】:

是否可以告诉 GCC 编译源代码,并忽略 __FILE____LINE__ 等宏,或者重新定义它们以扩展为比方说 - 一个空字符串?

【问题讨论】:

  • 真是个坏主意,你为什么要这样?很多代码(包括系统头文件)将依赖这些来做正确的事情。这只是在找麻烦。
  • 您为什么要这样做?因为:1. C 标准禁止重新定义/取消定义它们 2. 用 0-1 替换 __LINE__ 看起来很尴尬(这是一个整数值,你必须给出一些东西,不像 __FILE__ 的空字符串) 3 .它们的主要目的帮助调试(如果你不想要它们,为什么要首先使用它们?)。因此,如果您不想要它们或更好地保留它们,似乎唯一的方法是重新编写您的代码!

标签: c gcc compilation c-preprocessor flags


【解决方案1】:

与您可以使用的任何宏一样:

#undef __LINE__
#undef __FILE__

然后你可以重新定义它们。

您还可以传递-U macroname 来取消定义宏名称,并传递-D macroname=definition 来为gcc 选项定义宏名称。

请注意,如另一个答案所示,在 C 中取消定义或重新定义 __LINE____FILE__ 会调用未定义的行为。

【讨论】:

  • 我怀疑这样做会激怒 UB。请参阅我对此的回答。
  • @alk 但我认为相关的引用是这个:(c99, 6.10.8p4) “这些宏名称和定义的标识符都不是#define 的主题或 #undef 预处理指令。
  • 嗯,是的,也发现了这个..但是在这个上下文中没有提到 UB。
  • @alk 违反在 C 中不是约束的应要求调用 UB,参见 C99, 4.p2
  • @BitFiddlingCodeMonkey:我怀疑从 C99 到 C11 的许多重要更改(不是添加)不向后兼容。然而,这是我的一个假设...... - 详细信息:en.wikipedia.org/wiki/C11_%28C_standard_revision%29
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多