0

更新 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,我需要在 2 个地方扩展宏。

class a
{    
    virtual void func()
    {        
        ...
        //does something with the decl declaration        
    }
    ...
    //also expand some stuff here    
}

Boost 预处理器应该(理论上)允许我将 MAP_DECL 累积到一个序列中,并在最后将其扩展为 func() (同时在我们进行时扩展类字段)。


更新 1

我目前正在使用 Boost Preprocessor 库。每次我需要向序列中添加一些内容时,我目前都无法创建一个新的宏变量/定义,如下所示。

我正在尝试扩展 Boost Preprocessor 序列,但目前我一直在这样做

#define SEQ (w)(x)(y)(z) 
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)

原文

假设我有以下代码

#define CUR 2
#define CUR CUR + 2

如何强制第二行使用第一行的 CUR 值?

4

4 回答 4

5

简而言之,你不能。

在扩展 CUR 时(在第二个 之后#define),预处理器将用 CUR + 2 替换 CUR 的一个实例,并“蓝色绘制”名称 CUR(不再扩展它)。此后,C 编译器看到 CUR + 2,这很可能会产生编译错误。

于 2009-09-06T05:39:53.633 回答
3

即使你能做到,那也是危险的。
例子:

#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4
于 2009-09-06T05:41:01.010 回答
2

你不能这样做,你只能#define每个宏一次,否则编译器会溢出错误。

于 2009-09-06T05:40:33.520 回答
1

我尝试在某一时刻做类似的事情(附加到增强预处理器序列)。我狠狠地撞了墙(因为乔纳森在他的回答中所说的话),最终做了完全不同的事情。

后来我发现 boost MPL 类型的序列具有相同的有效限制(这完全有道理,但有时你直到真正碰到它才会看到一堵墙 :))。

您几乎必须定义整个序列或给它不同的名称。

您可能正在定义一些成员变量,然后在函数中使用它(注册?)。如果您将消息保存在一个容器中,您可以让您的 MAP_DECL 在其中添加一条消息,然后在函数中执行一个 for 循环。

#define MAP_BEGIN std::vector<Message> m_messages; \
  void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);

如果每条消息都是单独的类型,请尝试类型擦除(boost::any)或使它们从某个基类继承并存储。

于 2009-09-06T07:23:56.277 回答