使用 __LINE__ 为不同的变量名创建宏[重复]
Posted
技术标签:
【中文标题】使用 __LINE__ 为不同的变量名创建宏[重复]【英文标题】:Creating macro using __LINE__ for different variable names [duplicate] 【发布时间】:2012-05-09 22:00:32 【问题描述】:可能重复:Creating C macro with ## and LINE (token concatenation with positioning macro)
我正在尝试使用__LINE__
宏来生成不同的变量名。我有一个名为 Benchmark 的范围基准类(位于 utils 命名空间中),它的构造函数接受一个字符串。这是我创建的宏定义:
#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__))
不幸的是,这会导致以下错误:
<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization
这使我得出结论,__LINE__
宏没有得到扩展。我根据this post 创建了我的宏。你知道为什么__LINE__
没有得到扩展吗?
编辑:可能编译器信息也是相关的。我正在使用 Visual Studio 2010。
【问题讨论】:
嗯。你试过bm## __LINE__
(带空格)吗?
@Cameron 感谢您的评论,但没有任何改变。
好的,再尝试一个技巧:#define _BENCHMARK_SCOPE(line) utils::Benchmark bm##line(...
和 #define BENCHMARK_SCOPE _BENCHMARK_SCOPE(__LINE__)
@Cameron - 仍然无法正常工作。这是 ideone 上的一个示例:ideone.com/5r5l1(试图使其尽可能简单)
【参考方案1】:
您需要使用 2 个宏的组合:
#define COMBINE1(X,Y) X##Y // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)
然后将其用作,
COMBINE(x,__LINE__);
【讨论】:
您知道我为什么需要为此使用两个宏吗? @izomorphius,实际上你的问题是另一个问题的重复,在那里它得到了很好的解释。我已经对你的问题发表了评论,请检查一下。【参考方案2】:试试这个代码,我在旧项目中使用过它
#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#ifdef _MSC_VER // Necessary for edit & continue in MS Visual C++.
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __COUNTER__)
#else
# define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)
#endif
int ANONYMOUS_VARIABLE(var)
编辑:
我认为您应该在 Visual Studio 中使用 COUNTER,前提是还使用预编译的标头。
【讨论】:
它也适用于 LINE。【参考方案3】:您正在使用令牌粘贴。这发生在递归宏之前 扩展(以便您可以标记粘贴以获取您的宏的名称 想调用)。因此:
#define PASTE(a,b) a ## b
将准确的参数粘贴到PASTE
,然后尝试展开
生成的新令牌。为了达到你想要的效果,你需要一个
额外的间接级别:
#define PASTE_HELPER(a,b) a ## b
#define PASTE(a,b) PASTE_HELPER(a,b)
这里,PASTE
的参数将在 PASTE_HELPER
之前展开
调用。
【讨论】:
以上是关于使用 __LINE__ 为不同的变量名创建宏[重复]的主要内容,如果未能解决你的问题,请参考以下文章