假设我有两个具有相同成员变量但不同“前缀”的结构。一个在命名空间中,另一个以特定标记为前缀。
我想编写一个宏来对这些接受不同前缀作为输入的结构执行相同的操作。我试过这个:
#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: error: pasting formed '::foo', an invalid preprocessing token 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);
}
基本上,传递一个连接函数而不是标记本身。
关于c++ - 将带有 "::"的标记作为参数传递给 C/C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35354258/