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

本文探讨了C/C++编程中的关键概念和技术细节,包括静态编译模型、头文件包含的最佳实践、虚函数表机制、线程安全问题、函数重载及调用开销、Unicode编码使用、字符与整型区别、缓冲区溢出风险、预处理工作原理及宏的正确运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 

转载于:https://www.cnblogs.com/aoun/p/5776041.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值