【问题标题】:Using __LINE__ in a macro definition [duplicate]在宏定义中使用 __LINE__ [重复]
【发布时间】:2016-05-07 09:08:11
【问题描述】:

在宏中,我想生成一个具有不同名称的变量,并尝试使用__LINE__ 作为区分它们的一种方式。简化示例:

#define UNIQUE_INT   int prefix##__LINE__

UNIQUE_INT;
UNIQUE_INT;

但似乎__LINE__ 没有扩展,因为我在第二个中得到“int prefix__LINE__':redefinition”。

我想__LINE__ 不能在宏定义中使用,就好像它扩展了#definition 的行号而不是宏调用的行一样,但是让我问一下,以防万一有人有话要说。

【问题讨论】:

  • 这看起来是个糟糕的主意。即使您确实设法创建了名称基于行号的变量,您打算稍后在代码中如何引用这些变量?
  • @squeamishossifrage 这不是一个糟糕的主意,总的来说,它可能非常有用。关键不是你会再次引用一个变量,而是你要确保它是被构造的,而不是在函数的其余部分中被引用,因为一些副作用或调试。对于像这样的int,我想它没用,但可能只是一个例子。
  • 是的,示例过于简单化了。正如@chrisbeck 所说,有一个很好的答案。

标签: c++ macros c-preprocessor


【解决方案1】:

问题在于,在预处理器中,## 发生在 __LINE__ 扩展之前。如果再增加一层间接,就能得到想要的结果。

出于技术原因,您实际上需要两个宏(有时如果您在现有宏中使用它,则似乎不需要第二个...):

#define TOKEN_PASTE(x, y) x##y
#define CAT(x,y) TOKEN_PASTE(x,y)
#define UNIQUE_INT \
  int CAT(prefix, __LINE__)

UNIQUE_INT;
UNIQUE_INT;

【讨论】:

  • 但它不起作用(gcc 4.9.2)。它产生两行int prefix__LINE__;
  • 它不起作用。既不在 gcc 中,也不在 Visual Studio 中。结果相同。
  • 对不起,第一个版本有错误,因为我从现有代码中复制有点仓促。您需要使用两个宏,而不仅仅是一个。实际上,发布此副本的人一开始也犯了同样的错误:stackoverflow.com/questions/1597007/…... 我应该在回答之前检查是否有副本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 2012-05-09
  • 1970-01-01
  • 2018-05-12
相关资源
最近更新 更多