c++ - 使用(高阶)宏可以做多少?

标签 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)

最佳答案

如果您尽可能多地使用预处理器,您可能想尝试 boost.preprocessor .

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

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

关于c++ - 使用(高阶)宏可以做多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/829837/

相关文章:

ios - 启用静态库中使用的 ifdef 宏

msbuild - 在 msbuild (12.0) 命令行属性分配上引用宏

c++ - 是否有用于检测 C++11 标准库的预处理器指令?

c - 如何修复此字符串错误

c++ std::fstream 在 MacOS 上的行为

c++ - 如何在需要旧式 unsigned char 的地方使用新的 std::byte 类型?

c++ - 绘图时出现段错误

macros - 在语法扩展中使用程序标识符

c++ - 检查预处理器中是否使用 -fopenmp 调用了 g++

c++ - 如果我从 getter 生成迭代器,程序将中止