假设我有一个宏:
#define SUBST(MAGIC, ...) __VA_ARGS__ /* this won't work*/
我想把它叫做:
SUBST(int, MAGIC a = 1);
// expected output:
int a = 1;
是否有一些疯狂的间接和扩展,我可以使用它来强制扩展MAGIC
within 第二个参数,其值取决于对宏的调用?
当其他参数来自另一层,并且SUBST
宏使用不同的MAGIC
值重复多次时,就会出现这种情况。
例如:
#define WRAP(function, MAGIC, stuff, ...) \
void function(__VA_ARGS__) { stuff };
#define SUPERWRAP(function, stuff, ...) \
WRAP(function, uint8_t, stuff##_u8, __VA_ARGS__) \
WRAP(function, uint16_t, stuff##_u16, __VA_ARGS__)
SUPERWRAP(example, EXAMPLE_IMPL, template_t<MAGIC>, int)
这在模板中无法解决,因为:
#define WRAP(function, stuff, ...) \
template<class MAGIC>
int function(__VA_ARGS__) { stuff }
WRAP(example, /*...*/, template_t<MAGIC>, int)
不允许专门的实现,并且在专门化中将类型作为模板参数是一种部分专门化,这也是非法的。
1条答案
按热度按时间6mw9ycah1#
是否可以将参数中使用的单词替换为预处理器宏?
不可以,不能将参数中使用的单词替换为预处理器宏。
这是不可能的
有没有一些疯狂的间接和扩展,我可以用来强制扩展MAGIC在第二个参数中的值取决于对宏的调用?
没有
例如:#define WRAP(function,MAGIC,stuff,...)
使用C宏来生成函数定义会导致难以阅读、维护和调试的代码,没有人能够在以后修复或做任何事情。考虑一行一行地写你想要的东西。
你可以考虑使用更好的预处理器,比如jinja2,m4或者php。