14

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

我正在尝试使用__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__宏没有得到扩展。我根据这篇文章创建了我的宏。你有什么想法为什么__LINE__不被扩展?

编辑:可能编译器信息也是相关的。我正在使用视觉工作室 2010。

4

3 回答 3

18

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

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

然后将其用作,

COMBINE(x,__LINE__);
于 2012-04-30T07:15:22.763 回答
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 。

于 2012-04-30T07:13:39.713 回答
5

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

#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

于 2012-04-30T07:47:08.730 回答