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

时间:2009-05-06 14:19:59

标签: c++ macros c-preprocessor

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

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

以下是一些片段:

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

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

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

回应
  

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

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