《编码的法则--C++实用经验》

时间:2023-01-10 20:25:40

1.C/C++采用静态编译模型,结构和类的大小都是在编译后确定的

  定义结构和类变量时,需要根据大小来分配内存模型

 

2.头文件包含问题:

  (1)可以不包含头文件,那就不要包含

  (2)尽量在CPP文件中包含头文件,而非在头文件中

  (3)如果两个类相互递归定义,考虑前向声明或友元

   (4)使用#ifndef, 不要使用#pragma once(考虑到跨平台问题)

 

3.virtual 虚函数

  虚函数表在编译时生成

 

4.local static 变量使得函数不具有线程安全,不可重入

 

5. assert是宏而不是函数,仅在Debug版本起作用

 

6. 函数调用会产生开销(保护现场、恢复现场),函数开销 = 调用开销 + 函数体开销

 

7. 函数重载是自然语言一词多义在编程语言中的体现

  (1)使代码可读性更好(抽线更好)

  (2)构造函数  

 

8. 函数的可变参数没有类型检查,这样不安全

 

9. 降低函数复杂度是提高软件质量的一个重要手段

 

10. windows系统底层全部采用Unicode编码,ASCII接口也是在内部调用了Unicode接口,所以WinApp在开发时应采用Unicode字符串

  windows的Unicode编码为UTF-16, 而Linux流行的编码方案为UTF-8

 

11. 0 和 '0' 是不一样

  0是整形,内存模型全0

  '0'是字符,ascii为33

 

12. 缓冲区溢出

  C字符串以'\0'结尾,如果结尾处没有'\0',就会一直往后找

 

13. 预处理是编译器的工作,和C语言无关

  宏的作用域为文件(所以一般定义在头文件中)

  

14. 宏没有命名空间的限制

  因为命名空间(namespace)是C++的东西,而宏是从C过来的

  因为C没有命名空间,所以一个项目引入了很多第三方库之后,很多时候会导致命名冲突、类型重复定义

 

15. #和##

  #:字符串化操作符

    #define _raise_error(info) _raise(#info)

  ##: 符号连接操作符

    #define _T(x) L##x

 

16.