05-25-2020, 08:36 PM
此外还有一个问题,如果对 int 类型使用 std::abs 会怎样?水木上有网友写了个程序,自己定义了一个 int abs(int) 覆盖了标准库的 abs,结果使用 std::abs(int) 的时候,也用了程序里自定义的 abs.
原因也可以在 C++ 的头文件 bits/std_abs.h 里面找到,里面除了重载了 abs 函数之外,还有 using ::abs. 也就是说,用 std::abs(int) 和用 abs(int) 是一样的。
至于有没有链接时符号重复定义出错的问题,可以看 libc.a. 在 libc.a 里面,abs 被定义在 abs.o 里面,而且这个目标文件里面只有 abs 一个函数,所以只要程序里面定义了 abs,链接的时候就不可能链接到 abs.o. 如果使用动态链接,就更不用担心这个问题,因为链接器不会让最终的可执行文件在动态库里面找在目标文件中就存在的符号。
原因也可以在 C++ 的头文件 bits/std_abs.h 里面找到,里面除了重载了 abs 函数之外,还有 using ::abs. 也就是说,用 std::abs(int) 和用 abs(int) 是一样的。
至于有没有链接时符号重复定义出错的问题,可以看 libc.a. 在 libc.a 里面,abs 被定义在 abs.o 里面,而且这个目标文件里面只有 abs 一个函数,所以只要程序里面定义了 abs,链接的时候就不可能链接到 abs.o. 如果使用动态链接,就更不用担心这个问题,因为链接器不会让最终的可执行文件在动态库里面找在目标文件中就存在的符号。