在C中,保持效率的方法是使用宏(macro),宏的实现时依靠预处理器而不是编译器。预处理器直接用宏代码代替宏调用,这样子就没有了参数压栈等开销。但是在c++中,使用预处理宏有两个问题:
1.宏看起来像函数调用但是不总是这样,这样就隐藏了难以发现的错误。
2.预处理器不允许访问类的成员函数,这意味着预处理器宏不能用作类的成员函数。
这样就引出了内联函数。。。。。。。。。
预处理器的缺陷:
1.当参数在宏展开的时候,如 #define FLOOR(x,b) x>=b?0:1
if(FLOOR(a&0x0f,0x07)) 如果展开的话即为 if(a&0x0f>=0x07?0:1)//运算符优先级不一样
2,当在宏中使用一个参数,都对这个参数求值。如: #define BAND(x) (((x)>5 &&(x)<10)?(x):0)
/
for(int i=4; i<11; i++){
int a=i;
cout<<"BAND(++a)="<<BAND(++a)<<endl;
cout<<"\ta="<<a<<endl;
}
a 自增影响到参数,
任何在类中定义的函数都自动的称谓内联函数,也可以使用inline使之成为内联函数。
一般吧内联函数定义在头文件中,编译器看到这个定义时,会把函数类型(函数名字和返回值)和函数体放到符号表。
内联函数处于一种特殊状态,因为在头文件中声明该函数,所以必须包含头文件和该函数的定义,这些定义在每个用到该函数的文件中,但是不会出现产生多个定义错误的情况(不过,在任何使用内联函数地方该内联函数的定义都必须是相同的)。
容许读或者修改对象状态--即一个或几个内部变量的函数叫做访问函数,又分访问器和修改器 如 void SetValue(int a){value = a;} int GetValue() const {return value;}
localtime gmtime asctime ctime
localtime是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,而gmtime函数转换后的时间没有经过时区变换,是UTC时间 。
struct tm *localtime(const time_t *clock);
asctime是把时间换成ascii码。 ctime是把时间转换成字符串.
time_t 和 struct tm
小函数作为内联函数是理想的,但是大的函数话很可能性能上得不到改善
有两种情况编译器不能直行内联:
1. 任何种类的循环都是被认为太复杂而不扩展为内联函数
2.要显式或者隐式地取函数地址的时候,编译器也不能执行内联。
c++规定,只有在类声明结束之后,其中的内联函数才会被计算,因此函数的成员函数可以向前引用。如:
class Forward{
int i;
public:
Forward():i(0){};
int f() const {return g()+1;}
int g() const {return i};
}
字符串定义的完成是用#指示,它容许取一个标识符并把它转化为字符数组。
字符串拼接在当两个相邻的字符串没有分隔符时发生。
#define DEBUG(x) cout<<#x"="<<x<<endl;
#define TRACE(x) cerr<<#s<<endl; s
如果是标志粘贴,则使用"##"实现。实质就是把两个连接起来。!
#define FILED(a) char* a##_string;int a##_size