Effective C++ --条款2

本文讨论了在C++中使用const、enum和inline代替#define的原因,包括#define可能导致的错误和不便,如缺乏类型检查和不易追踪的问题。介绍了const常量、类中的static变量、enum枚举以及如何使用内联函数和模板来模拟宏功能,同时也指出#define在条件编译中的必要性。

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

条款02:尽量以const,enum,inline替换#define

1.#define的问题

  #define通常是在C中使用,例如 #define ASPECT_RATIO 1.653 (宏通常都为大写)

 只是在预处理器中将所有 ASPECT_RATIO替换为1.653,而 ASPECT_RATIO是编译器所看不到的,并且#define并没有数据类型。

 当编译报错时,报错信息只会输出1.653而不会提示 ASPECT_RATIO报错。不容易追踪查找问题。符号表中也不会记录ASPECT_RATIO。

延展:symbol table(符号表)

1 链接器是被符号表表所驱动的,换句话说,是被部分符号表所驱动的

这部分的符号表单独放在.dynsym段中,strip elf的符号表的时候,这个段是不会被strip的,因为动态链接的时候会用到。

.dynsym中有的符号在.symtab中都有。

2 .symtab符号表

2.1 .symtab符号表的创建

是编译器在分析阶段,即词法分析、语法分析和语义分析阶段生成的符号表。

2.2 gdb视角

当没有.debugxxx symbol table的时候,在gdb看来这个.symtab是minimal symbol。

虽然它提供的调试信息不多,但是,至少它可以帮助定位一个函数的起始位置,帮助设置断点。因为提供的信息有限,源码调试是肯定不行的,但是可以进行汇编级别的跟踪。

gdb读取.symtab之后,会按照address排序,这样由address到symbol就很方便了,另外

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值