C++通用编程的细微之处

Has*_*yed 2 c++ boost-mpl boost-preprocessor preprocessor-meta-program

我遇到的问题在以下代码中说明.

#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;
}
Run Code Online (Sandbox Code Playgroud)

错误:

test2.cc: In function ‘int main()’:
test2.cc:17: error: ‘X’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

我试图模仿的模式是在代码/构建级别扩展程序(很像nginx模块在编译时如何连接).我需要构建一个可扩展的编译时结构,它可以通过向#include我的构建中添加s来进行扩展(可插入),从而生成一个boost-mpl-vector,其中包含一个包含所有插件的唯一名称.因此,如果X是唯一的结束名称,则X_0,X_1,X_2是沿着向量push_back应用mpl-vector的方式构建的名称.

知道 boost :: preprocessor的抽象是关键,但我不想花时间去研究它,因为我正在构建系统的一部分,最终将编译时模块化.

所以,供将来参考,

  1. 为什么我上面会收到错误?
  2. 正确的原始预处理器模式应该是什么样的.
  3. 正确的boost-preprocessor-library模式是什么样的.

Chr*_*ard 5

用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;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以看到你得到错误的原因.