Boost.Preprocessor 带宏的索引列表
Boost.Preprocessor index list with macro
我正在尝试使用 Boost.Preprocessor 做一些编译时工作。我想使用在其他宏中计算的值来索引 table。当我尝试时出现以下错误:"concatenation with '(' in macro 'BOOST_PP_BOOL_I' does not create a valid token."
这是产生问题的最简单的代码。
#define MY_TABLE (0, (1, BOOST_PP_NIL))
#define MY_INDEX_FUNCTION(x) (x)
void func() {
int y = BOOST_PP_LIST_AT(MY_TABLE, MY_INDEX_FUNCTION(0));
}
很容易确定删除 MY_INDEX_FUNCTION
中的括号可以解决本例中的问题。我的实际代码使用更复杂的函数来计算更大 table.
中的 table 索引
有什么我可以做或改变的来解决这个问题,这样 parens 和更复杂的宏就不会引起问题吗?
BOOST_PP_LIST_AT
的第二个参数取一个index/integer。它与引擎盖下的 棘手的预处理器 hacks 一起工作。 parameter(expanded) 应该恰好是整数文字,而不是括号内的整数。应更改 MY_INDEX_FUNCTION
,以便传递给 BOOST_PP_LIST_AT
的参数是 字面意思 整数字面量:
#define MY_INDEX_FUNCTION(x) x
该宏不适用于算术表达式,这将不起作用:
#define MY_INDEX_FUNCTION(x) (x+1)
NOR
#define MY_INDEX_FUNCTION(x) x+1
但是你可以用
来做到这一点
#define MY_INDEX_FUNCTION(x) MY_INDEX_FUNCTION_ ## x
#define MY_INDEX_FUNCTION_0 1
#define MY_INDEX_FUNCTION_1 2
#define MY_INDEX_FUNCTION_2 3
//...
这个宏定义可以通过 (python-)脚本创建
def my_index_function(x):
# insert the behavior of the macro here
return x+1
MACRO_NAME = "MY_INDEX_FUNCTION"
INDEX_MAX = 255
for x in range(INDEX_MAX):
print("#define %s_%i %i" % (
MACRO_NAME,
x,
my_index_function(x),
))
print("#define %s(x) %s_ ## x" % (
MACRO_NAME,
MACRO_NAME,
))
我正在尝试使用 Boost.Preprocessor 做一些编译时工作。我想使用在其他宏中计算的值来索引 table。当我尝试时出现以下错误:"concatenation with '(' in macro 'BOOST_PP_BOOL_I' does not create a valid token."
这是产生问题的最简单的代码。
#define MY_TABLE (0, (1, BOOST_PP_NIL))
#define MY_INDEX_FUNCTION(x) (x)
void func() {
int y = BOOST_PP_LIST_AT(MY_TABLE, MY_INDEX_FUNCTION(0));
}
很容易确定删除 MY_INDEX_FUNCTION
中的括号可以解决本例中的问题。我的实际代码使用更复杂的函数来计算更大 table.
有什么我可以做或改变的来解决这个问题,这样 parens 和更复杂的宏就不会引起问题吗?
BOOST_PP_LIST_AT
的第二个参数取一个index/integer。它与引擎盖下的 棘手的预处理器 hacks 一起工作。 parameter(expanded) 应该恰好是整数文字,而不是括号内的整数。应更改 MY_INDEX_FUNCTION
,以便传递给 BOOST_PP_LIST_AT
的参数是 字面意思 整数字面量:
#define MY_INDEX_FUNCTION(x) x
该宏不适用于算术表达式,这将不起作用:
#define MY_INDEX_FUNCTION(x) (x+1)
NOR
#define MY_INDEX_FUNCTION(x) x+1
但是你可以用
来做到这一点#define MY_INDEX_FUNCTION(x) MY_INDEX_FUNCTION_ ## x
#define MY_INDEX_FUNCTION_0 1
#define MY_INDEX_FUNCTION_1 2
#define MY_INDEX_FUNCTION_2 3
//...
这个宏定义可以通过 (python-)脚本创建
def my_index_function(x):
# insert the behavior of the macro here
return x+1
MACRO_NAME = "MY_INDEX_FUNCTION"
INDEX_MAX = 255
for x in range(INDEX_MAX):
print("#define %s_%i %i" % (
MACRO_NAME,
x,
my_index_function(x),
))
print("#define %s(x) %s_ ## x" % (
MACRO_NAME,
MACRO_NAME,
))