26使用#define定义的伪函数(函数宏)
C语言中,#define经常被用来定义伪函数,避免函数调用的开销带来的效率的重要性被置于
安全性之上。
在C++语言中,inline函数几乎在任何时候都是相对于伪函数而言更佳的选择。
C语言中,#define经常被用来定义伪函数,避免函数调用的开销带来的效率的重要性被置于
安全性之上。
在C++语言中,inline函数几乎在任何时候都是相对于伪函数而言更佳的选择。
宏被用作伪函数时,仍然饱受将其用于显式常量时所遭遇的作用域问题之苦。
execbump.cpp
#include <iostream>
// Uncomment only one symbol!
//#define MACRO
//#define FUNCTION
#define MONOSTATE
#ifdef MACRO
int kount = 0;
#define execBump( func ) (func(), ++kount)
void aFunc() {
extern void g();
int kount = 0;
while( kount++ < 10 )
execBump( g );
//对局部变量(而非全局变量)kount做了自增操作
}
void g() { std::cout << "Called g, kount = " << kount << std::endl; }
#endif
//=================================================
#ifdef FUNCTION
int kount = 0;
inline void execBump( void (*func)() )
{ func(); ++kount; }
void aFunc() {
extern void g();
int kount = 0;
while( kount++ < 10 )
execBump( g ); // increment local count!
}
void g() { std::cout << "Called g, kount = " << kount << std::endl; }
#endif
//=================================================
#ifdef MONOSTATE
class ExecBump { // 单态设计模式
public:
void operator ()( void (*func)() )
{ func(); ++count_; }
int get_count() const
{ return count_; }
private:
static int count_;
};
int ExecBump::count_ = 0;
void aFunc() {
extern void g();
ExecBump exec;
int kount = 0;
while( kount++ < 10 )
exec( g );
}
void g() { std::cout << "Called g, count = " << ExecBump().get_count() << std::endl; }
#endif
int main() {
aFunc();
getchar();
return 0;
}
输出
Called g, count = 0
Called g, count = 1
Called g, count = 2
Called g, count = 3
Called g, count = 4
Called g, count = 5
Called g, count = 6
Called g, count = 7
Called g, count = 8
Called g, count = 9