【发布时间】:2015-02-19 23:07:09
【问题描述】:
看到this question 让我想知道为什么这种方法(玩具示例):
#define foo(x) bar[x] = 0
会比函数更受欢迎:
void foo(unsigned x){ bar[x] = 0; }
在上面链接的问题之前,我之前只在 PolarSSL 库中看到过一次,我认为它是某种优化,并尽量不去想太多。
我假设使用预处理器宏将“调用”替换为“(非)函数体”,无论它存在于何处;而void 函数可能会或可能不会被编译器优化,因此可能会导致一两个小而简单的操作产生大量分支。
还有其他好处吗?
什么时候首选宏方法,什么时候更信任编译器?
【问题讨论】:
-
标记了 C 和 C++,以防部分风格的问题可能会有所不同。
-
不是首选。当编译器还没有好的优化器时,这些宏就被ab/使用了。
-
或在 C++ 和 C99 中的
inlinespecifier 之前。 -
@HansPassant 啊,好吧-我会继续避开自己:)
-
并非所有可以用宏完成的事情都可以用函数完成。了解宏可以做什么,但是当一个函数可以完成相同的事情时使用一个函数。不需要完全避免它们。