版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
basic question
item1: n « 1 + 1 == 4n , not 2n + 1
item2: what will happen?
correct
item3: macro pollution:
item4: 多语句宏使用错误,应该用{}把多语句宏括起来,或者最好是用inline函数代替宏.
item5: what’s wrong?
correct : int c;
correct: flag is signed bit, value only be 0 or -1. so change to unsigned int flag: 1;
correct: –size > 0
- item11: struct init style.
won’t compiling pass in latest complier
but will pass in old complier
新的编译器模板两段编译:
- 扫描所有非依赖名称
- (实例化模板)扫描所有依赖名称(只有实例化的时候才能消除歧义的名称)
reason: num是一个非依赖参数, 但是但是定义在基类中的,目前的编译器还没有实现第一阶段到模板基类中查找名称,因此会报错:num undeclared.
旧版的编译器没有实现两段编译,对模板类的语法解析时,所有的名字查找都留在了实例化的时候进行,所以可以通过编译
correct: this->num 将会使num变成依赖型名称
lib functions.
- item1: sprintf: segmentation fault.
suggestion
- snprintf: 会检查返回值n,如果n>len(buffer), 会重新分配空间并再一次调用snprintf.
- asprintf: 不预先分配buf内存,复制过程中根据实际复制源的大小动态分配内存,参考libc手册
- item2: snprintf parameters:
- item3: return value of snprintf:
snprintf返回实际写入到buf的字符个数(假设buf大小没有限制)
e.g.:
“%s” src = “123” -> len = 3
“src=%s” src = “123” -> len = strlen(“str=”) + strlen(src) = 6
“%s” src = “1234567890123” -> len = 13
correct