强制预处理器在重定义中使用先前的定义

时间:2009-09-06 05:36:09

标签: c++ g++ c-preprocessor boost-preprocessor

更新3

没关系。我有点得到我想要的东西。以下内容给出了类中的唯一标识符。

static const int _counter_start = __COUNTER__;
static const int val1 = __COUNTER__ - _counter_start;
static const int val2 = __COUNTER__ - _counter_start;

更新2

Boost Preprocessor

我将使用此功能实现类似于消息映射的内容。

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值?

4 个答案:

答案 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)或使它们从某个基类继承并存储它。