[英]Pass a token with “::” as argument to C/C++ macro
假设我有两个结构具有相同的成员变量,但具有不同的“前缀”。 一个在命名空间中,另一个在前面加上特定的令牌。
我想编写一个宏以对这些接受不同前缀作为输入的结构执行相同的操作。 我尝试了这个:
#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__)
会导致编译错误。
很难理解我脱离上下文提出的解决方案,但是这里是:
#define CONCATENATE_A(X) A__ ## X
#define CONCATENATE_B(X) B:: X
#define GET_BAR(CONCATENATE)\
{ \
CONCATENATE(foo) my_foo;\
printf("Bar is: %d", my_foo.bar);\
}
int main(int argc, char ** argv) {
GET_BAR(CONCATENATE_A);
GET_BAR(CONCATENATE_B);
}
基本上,传递串联函数而不是令牌本身。
::foo
不是预处理令牌。 ::
和foo
是标记。 令牌粘贴操作符用于基于其他令牌形成新令牌。
对于这两个用例,您将不得不使用不同的宏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.