强制预处理器使用先前定义的重新定义
-
21-09-2019 - |
题
更新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
}
升压预处理器应该(理论上)让我积累MAP_DECL成序列,它扩展成FUNC()在结束(同时扩大级领域,因为我们去)。
更新1 :
我使用的是此刻的升压预处理器库。目前我卡创建以下我需要的东西添加到序列每次都像一个新的宏变量/定义。
我试图扩大升压预处理器序列和我被困在目前这样
#define SEQ (w)(x)(y)(z)
#define SEQ2 BOOST_PP_SEQ_PUSH_BACK(SEQ, a)
原始:
假设我有以下代码
#define CUR 2
#define CUR CUR + 2
如何强制的第二线从第一行中使用CUR的值?
解决方案
简洁地说,你不能。
目前CUR时膨胀(第二#define
之后)的时间,预处理器将替换CUR + 2 CUR的一个实例,和“蓝颜料”名称CUR(未扩大它的进一步的)。此后,C编译器看到CUR + 2,其中最有可能的产率编译错误。
其他提示
即使你能做到这一点,这是危险的。结果 例如:
#define CUR 2
#define CUR CUR + 2
...
int x = CUR*4; // x = 2 + 2 * 4
您不能这样做,你只能#定义每个宏一次,否则编译器会溢出错误。
我想这样做在一个点类似的东西(追加提高预处理器的序列)。我撞到墙上硬(因为什么乔纳森在他的回答说),并最终做完全不同的事情。
后来我发现,升压MPL型序列具有相同的有效的限制(这完全是有道理的,但有时看不到的壁,直到实际碰到它:))
。您几乎必须定义整个序列或给它不同的名字。
您可能定义一些成员变量,然后在功能做与它的东西(注册?)。如果你把消息在一个容器,可以让你的MAP_DECL添加一条消息到它,然后在功能只是做一个for循环。
#define MAP_BEGIN std::vector<Message> m_messages; \
void buildMap() {
#define MAP_END }
#define MAP_DECL(...) m_messages.push_back(...);
如果每个消息是独立的类型,试试类型擦除(升压::任何)或使它们从一些基类和存储继承的。
不隶属于 StackOverflow