c++ 是否可以将参数中使用的单词替换为预处理器宏?

jpfvwuh4  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(166)

假设我有一个宏:

#define SUBST(MAGIC, ...) __VA_ARGS__  /* this won't work*/

我想把它叫做:

SUBST(int, MAGIC a = 1);

// expected output:
int a = 1;

是否有一些疯狂的间接和扩展,我可以使用它来强制扩展MAGICwithin 第二个参数,其值取决于对宏的调用?
当其他参数来自另一层,并且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)

不允许专门的实现,并且在专门化中将类型作为模板参数是一种部分专门化,这也是非法的。

6mw9ycah

6mw9ycah1#

是否可以将参数中使用的单词替换为预处理器宏?
不可以,不能将参数中使用的单词替换为预处理器宏。

SUBST(int, MAGIC a = 1);
// expected output:
int a = 1;

这是不可能的
有没有一些疯狂的间接和扩展,我可以用来强制扩展MAGIC在第二个参数中的值取决于对宏的调用?
没有
例如:#define WRAP(function,MAGIC,stuff,...)
使用C宏来生成函数定义会导致难以阅读、维护和调试的代码,没有人能够在以后修复或做任何事情。考虑一行一行地写你想要的东西。
你可以考虑使用更好的预处理器,比如jinja2,m4或者php。

相关问题