将带有“::”的标记作为参数传递给C / C ++宏

时间:2016-02-12 03:20:18

标签: c++ namespaces macros c-preprocessor

假设我有两个具有相同成员变量但不同“前缀”的结构。一个在命名空间中,另一个以某个标记为前缀。

我想编写一个宏来对这些结构执行相同的操作,这些结构接受不同的前缀作为输入。我试过这个:

#include <cstdio>

struct A__foo_
{
  int bar;
} typedef A__foo;

namespace B {
  struct foo {
    int bar;
  };
}

#define GET_BAR(Prefix)\
  { \
    Prefix ## foo my_foo;\
    printf("Bar is: %d", my_foo.bar);\
  }

int main(int argc, char ** argv) {
  GET_BAR(A__);
  GET_BAR(B::);
}

我收到此编译器错误:

  

macros_example.cpp:22:7:错误:粘贴形成':: foo',一个无效的预处理令牌         GET_BAR(B ::);

有没有办法以优雅的方式重写这个宏来接受两个输入并用“foo”连接它们?我已经尝试通过连接“B”和双冒号来预处理B ::。我也尝试将Prefix ## foo更改为Prefix foo,但随后调用GET_BAR(A__)会导致编译错误。

2 个答案:

答案 0 :(得分:2)

我很难理解我在上下文中提出的解决方案,但现在是:

{{1}}

基本上,传递一个连接函数而不是标记本身。

答案 1 :(得分:1)

::foo不是预处理令牌。 ::foo是令牌。令牌粘贴操作符用于基于其他令牌形成新令牌。

您必须为这两个用例使用不同的宏。