编译器遇到声明时,会在符号表中存储名称及其属性。linkage属性主要影响多处同名符号的链接:只有定义可以链接到一起,而声明则不然。linkage有四种类型,包括global/namespace scope、编译单元、module和block scope/local scope,这些范围是为了让linker(如gcc的ld)处理链接的可见性。namespace中的函数成员...
C++的符号链接
C++程序中的每个名称,如变量、函数或类型名,都可能具有linkage属性,这是程序中名称的四个特性之一(作用域、类型、存储持久性和linkage)。首先,我们需要理解声明与定义的区别:声明通常包括定义,但不总是,非定义的声明会在后续提及。
编译器遇到声明时,会在符号表中存储名称及其属性。linkage属性主要影响多处同名符号的链接:只有定义可以链接到一起,而声明则不然。linkage有四种类型,包括global/namespace scope、编译单元、module和block scope/local scope,这些范围是为了让linker(如gcc的ld)处理链接的可见性。
namespace中的函数成员、static数据成员等与类具有相同的linkage。internal linkage的名称仅限于同一编译单元内链接,如const变量在C++中默认为这种属性。inline函数在头文件中被多次include时,编译器可能选择替换或维护全局extern定义。
对于未明确规定的变量、函数等,若满足特定条件(如模板的特定情况),则默认为internal linkage。module linkage允许同一module内的其他scope或同一编译单元内的named module内的名称链接。no linkage的名称仅限于所在scope内的链接。
external linkage的名称可被其他编译单元或同一编译单元内其他scope的名称链接。在C++ release编译中,linker只寻找external linkage的名称,其他linkage类型的名称在链接阶段会被丢弃。2024-08-22