预编译器函数在编译时在C中进行评估

hig*_*dth 6 c c-preprocessor

我想编写在编译时评估的预处理器函数/数组.例如,如果我定义

#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)

显然,我们必须使用文字作为参数.这可能吗?

Geo*_*che 5

当然可能.虽然您可以手动执行此操作,但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来提取预处理器组件.