C ++泛型编程的细微之处

我遇到的问题在以下代码中说明。
#include <iostream>

#define X 4

int main()
{

    std::cout << "should be 4: " << X << std::endl;
#define Y X + 4
    std::cout << "should be 8: " << Y << std::endl;

#undef Y
#define Y X+0
#undef X
#define X Y+1

    std::cout << "expecting 5: " << X << std::endl;
}
错误:
test2.cc: In function ‘int main()’:
test2.cc:17: error: ‘X’ was not declared in this scope
我试图模仿的模式是在代码/构建级别扩展程序(很像nginx模块在编译时如何连接)。我需要构建一个可扩展的编译时结构,它是可扩展的(可插入的),通过在我的构建中添加
#include
s,这会产生一个boost-mpl-vector,其中包含一个包含所有插件的唯一名称。因此,如果
X
是唯一的结束名,则X_0,X_1,X_2是沿着向量具有mpl-vector
push_back
的方式构建的名称。 我知道boost :: preprocessor的抽象是关键,但我不想花时间去研究它,因为我正在构建系统的一部分,最终将编译时模块化。 所以,供将来参考, 为什么我上面会收到错误? 正确的原始预处理器模式应该是什么样的。 正确的boost-preprocessor-library模式是什么样的。     
已邀请:
用g ++ -E编译给出了这个:
int main()
{

    std::cout << "should be 4: " << 4 << std::endl;

    std::cout << "should be 8: " << 4 + 4 << std::endl;






    std::cout << "expecting 5: " << X+0 +1 << std::endl;
}
所以你可以看到你得到错误的原因。     
为什么不一石二鸟并使用名称空间。
// a.hpp:

namespace a {
    const int module_id = 0;

    class module_a : extension_module< module_id > { … };
}

#undef last_module
#define last_module a

// b.hpp:

namespace b {
    const int last = last_module::module_id + 1;

    class module_b : extension_module< module_id > { … };
}

#undef last_module
#define last_module b
这样做不那么“聪明”,留下了ID的踪迹。 但是,每次ODR工作时,模块都需要包含在相同的顺序中。 我不主张杀死任何鸟类。     
您的代码示例的问题是您在X和Y宏中具有循环依赖性: Y定义为X + 0,X定义为Y + 1。因此,当扩展宏时(在您使用X的位置发生),您就会遇到问题。 加: 似乎行为是这样的:当在其定义中扩展宏
X
时,X未在预处理器名称空间中定义,因此您将X + 0 + 1视为X扩展。     

要回复问题请先登录注册