在C++中,符号分为强符号和弱符号。强符号指的是编译器能明确知道的数据和函数,如已初始化的全局变量和函数,它们拥有确切的数据和函数体。而未初始化的全局变量则被编译器识别为弱符号。链接器在处理被多次定义的符号时遵循一定的规则:不允许强符号被多次定义,如果出现同名的强符号则会报错。若某符号在某个文件中为强符号,在其他文件中为弱符号,则会选择强符号。如果所有文件中符号均为弱符号,则选择占用空间最大的一个。弱符号对库十分有用,它允许用户覆盖库中的定义,如使用自定义版本的库函数,或者对功能模块的引用定义为弱引用。当将扩展模块与程序链接时,功能模块可以正常运行。去除某些模块后,程序仍能正常链接,但可能缺少部分功能,这使得程序功能更加灵活。内联函数在C++中被编译器识别为弱符号,这也是它能被多次定义而不报错的原因。不过,内联函数的实现也可能存在陷阱。例如,即使避免了重定义,编译器优化开关关闭时内联函数也可能被其他函数替代,导致逻辑错误。因此,内联函数的使用需谨慎。如果变量、函数在同一个工程中多次定义,链接期间会报“对xxx多重定义”的错误,而内联函数声明和定义分别在头文件和源文件中时,若在其他文件中被调用则会报“对xxx未定义的引用”错误。内联函数在头文件中定义,以避免此类问题。inline关键字修饰的函数在头文件中定义时,编译器不会报“对xxx多重定义”的错误,因为inline起到内联的作用。这得益于inline被识别为弱符号。