Pau*_*per 6 c macros c-preprocessor
C/C++中不缺少类似于函数的坏或宏的例子.
#define SQUARE(x) x * x
printf("%d", SQUARE(4)); //16
printf("%d", SQUARE(3+1)); //7
#undef SQUARE
#define SQUARE(x) (x) * (x)
printf("%d", 36/4); //9
printf("%d", SQUARE(6)/SQUARE(2)); //36
#undef SQUARE
#define SQUARE(x) ((x) * (x))
int x = 3;
++x;
printf("%d", SQUARE(x)); //16
int y = 3;
printf("%d", SQUARE(++y)); //?
#undef SQUARE
Run Code Online (Sandbox Code Playgroud)
鉴于类似函数的宏的问题,它们有什么好的/谨慎/推荐用途的例子?
是否有任何时候类似函数的宏对函数更有用?
我认为必须有一些非常好的案例,否则预处理器制造商会让他们的工作变得更容易并将其排除在外.
评论已经涵盖了大部分内容。
某些类型的调试和检测只能通过使用函数式宏来完成。最好的例子是assert(),但函数式宏也可以用于检测代码以进行分析。诸如 和 之类的神奇宏__FILE__以及__LINE__诸如#引用和##标记粘贴之类的功能使得类似函数的宏对于调试和分析很有价值。
在 C++ 中,使用模板和通常更积极的内联,几乎没有其他理由使用函数式宏。例如,由于问题中说明的原因,模板函数std::max是比宏更好的解决方案。MAX
在C中,有时需要优化以确保一小段代码被内联。宏尽管有所有警告,但在这种情况下偶尔仍然有用。ALLCAPS 命名约定是为了警告程序员,这实际上是一个宏而不是一个函数,因为简单文本替换存在所有问题。例如,如果您有几个地方需要std::max与性能关键的代码段中的等效项,则宏(尽管有其所有危险)可能是一个有用的解决方案。