条款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就很方便了,另外