更新3 :
没关系。我有点得到我想要的东西。以下内容给出了类中的唯一标识符。
static const int _counter_start = __COUNTER__;
static const int val1 = __COUNTER__ - _counter_start;
static const int val2 = __COUNTER__ - _counter_start;
更新2 :
我将使用此功能实现类似于消息映射的内容。
class a
{
...
MAP_BEGIN()
MAP_DECL...
MAP_END()
...
};
问题是,对于每个MAP_DECL,我需要在两个地方扩展宏。
class a
{
virtual void func()
{
...
//does something with the decl declaration
}
...
//also expand some stuff here
}
Boost预处理器应该(理论上)允许我将MAP_DECL累积到一个序列中并在最后将它扩展为func()(同时在我们去的同时扩展类字段)。
更新1 :
我目前正在使用Boost预处理器库。我每次都需要在序列中添加一些内容时,我目前无法创建一个新的宏变量/定义,如下所示。
我正在尝试扩展Boost预处理程序序列,而我现在仍然坚持这样做
#define SEQ (w)(x)(y)(z)
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)
原始:
假设我有以下代码
#define CUR 2
#define CUR CUR + 2
如何强制第二行使用第一行的CUR值?
答案 0 :(得分:5)
简洁,你不能。
当CUR展开时(在第二个#define
之后),预处理器将用CUR + 2替换CUR的实例,并且'blue paint'命名为CUR(不再扩展它)。此后,C编译器会看到CUR + 2,这很可能会产生编译错误。
答案 1 :(得分:3)
即使你能做到这一点,也很危险 示例:
#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4
答案 2 :(得分:2)
你不能这样做,你只能#define每个宏一次,否则编译器会溢出一个错误。
答案 3 :(得分:1)
我尝试在某一点做类似的事情(附加到增强预处理器序列)。我努力撞墙(因为Jonathan在他的回答中说的话)并最终做了完全不同的事情。
后来我发现增强MPL类型序列具有相同的有效限制(这完全有意义,但有时你看不到墙,直到你碰到它:)。)。
你几乎必须定义整个序列或给它不同的名称。
您可能正在定义一些成员变量,然后在函数中使用它(注册?)。如果将消息保存在容器中,则可以使MAP_DECL向其中添加消息,然后在函数中执行for循环。
#define MAP_BEGIN std::vector<Message> m_messages; \
void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);
如果每条消息都是单独的类型,请尝试键入erasure(boost :: any)或使它们从某个基类继承并存储它。