我想编写在编译时评估的预处理器函数/数组.例如,如果我定义
#define MYARR[] {5,4,3,2,1,0}
Run Code Online (Sandbox Code Playgroud)
然后,代码
int x = R[0];
Run Code Online (Sandbox Code Playgroud)
应该表示为
int x = 5;
Run Code Online (Sandbox Code Playgroud)
到编译器.(当然只能在索引中使用文字).如果代码大小/内存很关键且我们不想存储MYARR,这很重要,但我们需要它以方便编码.
编译时间函数也会很好.例如,像
#define MYMAP(n)
#if n==1
5
#else
2
Run Code Online (Sandbox Code Playgroud)
所以,声明
int x = MYMAP(4);
Run Code Online (Sandbox Code Playgroud)
应该作为编译器呈现给编译器
int x = 2;
Run Code Online (Sandbox Code Playgroud)
显然,我们必须使用文字作为参数.这可能吗?
当然可能.虽然您可以手动执行此操作,但Boost.Preprocessor已经为您提供了所需的工具:
#include <boost/preprocessor.hpp>
#define SEQ (5)(4)(3)(2)(1)(0)
int x = BOOST_PP_SEQ_ELEM(0, SEQ);
Run Code Online (Sandbox Code Playgroud)
......转变为:
int x = 5;
Run Code Online (Sandbox Code Playgroud)
它还包括算术,比较和控制结构类似IF,FOR,FOR_EACH,枚举......你一定要记住,你可以使用的数据类型是相当有限的.
再次使用Boost.PP,您的第二个示例可以这样完成:
#define MYMAP(x) BOOST_PP_IF(BOOST_PP_EQUAL(x, 1), 5, 2)
Run Code Online (Sandbox Code Playgroud)
你当然可以手动实现Boost.PP的功能,但考虑到所需的时间和精力,我个人不会打扰.
作为C用户,您不会对Boost的其余部分感兴趣,因此您可能希望使用bcp来提取预处理器组件.