使用__LINE__为不同的变量名创建宏

izo*_*ica 13 c++ macros concatenation visual-studio-2010 c-preprocessor

可能重复:
使用##和LINE创建C宏(使用定位宏进行标记连接)

我试图使用__LINE__宏来生成不同的变量名称.我有一个名为Benchmark的作用域基准测试类(位于utils命名空间中),它的构造函数接受一个字符串.这是我创建的宏定义:

#define BENCHMARK_SCOPE utils::Benchmark bm##__LINE__(std::string(__FUNCTION__))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会导致以下错误:

<some_file_name>(59): error C2374: 'bm__LINE__' : redefinition; multiple initialization

这使我得出结论__LINE__宏不会扩展.我根据这篇文章创建了我的超时空.你有想法为什么__LINE__不扩大?

编辑:可能编译器信息也相关.我正在使用visual studio 2010.

iam*_*ind 16

您需要使用2个宏的组合:

#define COMBINE1(X,Y) X##Y  // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)
Run Code Online (Sandbox Code Playgroud)

然后用它,

COMBINE(x,__LINE__);
Run Code Online (Sandbox Code Playgroud)

  • @izomorphius,实际上你的问题是另一个问题的副本,在那里可以很好地解释.我已经评论过你的问题,请检查一下. (3认同)

Mar*_*ius 5

尝试这个代码,我在一个较旧的项目中使用它

#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)
Run Code Online (Sandbox Code Playgroud)

编辑:

我认为只有在使用预编译头文件时才应在visual studio中使用COUNTER.


Jam*_*nze 5

您正在使用令牌粘贴。这发生递归宏扩展之前(以便您可以标记粘贴以获取要调用的宏的名称)。从而:

#define PASTE(a,b) a ## b
Run Code Online (Sandbox Code Playgroud)

将粘贴传递给的确切参数PASTE,然后尝试扩展生成的新令牌。为了获得想要的效果,您需要附加的间接级别:

#define PASTE_HELPER(a,b) a ## b
#define PASTE(a,b) PASTE_HELPER(a,b)
Run Code Online (Sandbox Code Playgroud)

在这里,to的参数PASTE将在PASTE_HELPER调用之前扩展。