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

时间:2012-04-30 07:00:05

标签: c++ visual-studio-2010 macros concatenation c-preprocessor

  

可能重复:
  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。

3 个答案:

答案 0 :(得分:14)

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

#define COMBINE1(X,Y) X##Y  // helper macro
#define COMBINE(X,Y) COMBINE1(X,Y)

然后将其用作

COMBINE(x,__LINE__);

答案 1 :(得分: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)

编辑:

我认为只有在使用预编译标题时才应在visual studio中使用 COUNTER

答案 2 :(得分:4)

您正在使用令牌粘贴。 递归宏之前发生 扩展(以便您可以使用令牌粘贴来获取宏的名称 想要调用)。因此:

#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之前展开 调用