以下情况会导致链接问题。
函数在一个地方声明带有一个 const 参数,而在另一个地方又声明带有一个非 const 参数。
示例:
void foo1(const int); void foo1(int); |
这两个声明是等效的,但编译器会将其重整为两个不同的名称。要避免这个问题,则不应将值参数声明为 const。例如,在任何位置都使用 void foo1(int);,包括该函数定义体。
函数有两个具有相同复合类型的参数,但只有一个参数是用 typedef 声明的。
示例:
class T; typedef T x; // foo2 has composite (that is, pointer or array) // parameter types void foo2(T*, T*); void foo2(T*, x*); void foo2(x*, T*); void foo2(x*, x*); |
所有的 foo2 声明都是等效的,并且应该重整相同的名称。但是,编译器只会重整部分声明的名称。为了避免这个问题,应该统一使用 typedef。
如果您无法统一使用 typedef,解决方法是:在定义该函数的文件中使用弱符号,使得声明与函数的定义一致。例如:
#pragma weak "__1_undefined_name" = "__1_defined_name" |
请注意,某些重整名称依赖于目标体系结构。(例如,在 SPARC V9 体系结构 (-m64) 中,size_t 是 unsigned long,而在其他体系结构中是 signed int。)在这种情况下,会出现两个版本的重整名称,分别对应两个模式。这时必须使用两个 pragma,并用适当的 #if 指令对其进行控制。