【发布时间】:2010-11-25 23:27:12
【问题描述】:
更新 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 预处理器库。每次我需要向序列中添加一些内容时,我目前都无法创建一个新的宏变量/定义,如下所示。
我正在尝试扩展 Boost 预处理器序列,但目前我一直在做这件事
#define SEQ (w)(x)(y)(z)
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)
原文:
假设我有以下代码
#define CUR 2
#define CUR CUR + 2
如何强制第二行使用第一行的 CUR 值?
【问题讨论】:
-
你为什么要这样做?
-
谢谢乔纳森。哇,我拼写不好。
-
即使(或者可能特别是)更新到位,我发现很难想象你想要实现什么。对于初学者来说,括号中的 w, x, y, z 部分让我难以置信。然后,在不知道 BOOST_PP_SEQ_PUSH_BACK() 应该做什么的情况下,我只能猜测 SEQ2 在您的理想世界中可能会扩展为 '(w)(x)(y)(z)(a)'。 SEQ 或 SEQ2 没有明确的参数似乎有点奇怪 - 这通常表明不需要的宏处理。但这是很多猜测 - 您能否扩展您的更新以更准确地显示您想要实现的效果?
-
第二次更新后...你确定你应该尝试(ab?)像这样使用预处理器吗?你确定不能在 C++ 中使用模板来达到预期的效果吗?为什么要通过宏构建类体?用户会写什么?用户(程序员)会写#define MAP_BEGIN() ...和#define MAP_DECL ...和#define MAP_END() ...然后您的代码将使用这些定义来编写类吗?
-
好吧,现在要使用这个类,用户必须在 3 个不同的地方声明这个映射(一次是静态声明消息,一次是注册它,一次是在实现中定义它)。宏将驻留在另一个头文件中,用户只是在使用它们。
标签: c++ g++ c-preprocessor boost-preprocessor