繁体   English   中英

(高阶)宏可以处理多少?

[英]How much one can do with (higher order) macros?

将宏名称作为其他宏的参数来模拟高阶函数是否“安全”?

即我应该在哪里看不到自己的脚?

以下是一些片段:

#define foreach_even(ii, instr) for(int ii = 0; ii < 100; ii += 2) { instr; }
#define foreach_odd(ii, instr)  for(int ii = 1; ii < 100; ii += 2) { instr; }

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

部分应用怎么样,我可以这样做吗?

#define foreach(ii, start, end, step, instr) \
  for(int ii = start; ii < end; ii += step) { instr; }

#define foreach_even(ii, instr) foreach(ii, 0, 100, instr)
#define foreach_odd(ii, instr)  foreach(ii, 1, 100, instr)

#define sum(foreach_loop, accu) \
  foreach_loop(ii, {accu += ii});

int acc = 0;
sum(foreach_even, acc);
sum(foreach_odd, acc);

我可以在宏中定义一个宏吗?

#define apply_first(new_macro, macro, arg) #define new_macro(x) macro(arg,x)

如果您正在尽可能多地使用预处理器,则可能需要尝试使用boost.preprocessor

但请注意,这样做并不安全 例如,逗号在使用预处理器时会导致很多问题。 不要忘记预处理器不理解(甚至试图理解)它们生成的任何代码。

我的基本建议是“不要这样做”,或“尽可能谨慎地做”。

我完全在c-preprocessor中实现了一个烂小的单元测试框架。 几十个宏,很多宏是另一个宏类型的东西的参数。

这种事情在最佳实践意义上并非 “安全”。 有一些微妙而且非常强大的方法来射击自己的脚。 单元测试项目是一个失控的玩具。

不知道你是否可以嵌套宏定义。 我对此表示怀疑,但我会去尝试... gcc不喜欢它,并回应

nested_macro.cc:8:错误:在程序中迷路'#'
nested_macro.cc:3:错误:在'('标记之前)的预期构造函数,析构函数或类型转换
nested_macro.cc:3:错误:在'}'标记之前的预期声明

自插 :如果您对单元测试框架感兴趣, 访问https://sourceforge.net/projects/dut/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM