Oracle Solaris Studio 12.2:C++ 用户指南

B.2.19 #pragma weak


#pragma weak name1 [= name2]

可使用 weak 定义弱全局符号。该 pragma 主要在源文件中用于生成库。链接程序在不能解决弱符号时不会发出警告。

weak pragma 可以按以下两种形式之一来指定符号:

B.2.19.1 #pragma weak name

采用 #pragma weak name 形式时,指令使 name 成为弱符号。链接程序没有找到 name 的符号定义时,不会显示错误消息,也不会出现符号的多个弱定义的错误消息。链接程序仅执行第一个遇到的定义。

如果另一个编译单元有函数或变量的强定义,那么 name 将链接到它。如果没有 name 的强定义,那么链接程序符号的值为 0。

以下指令将 ping 定义为弱符号。链接程序找不到名为 ping 的符号的定义时,不会生成错误消息。


#pragma weak ping

#pragma weak name1 = name2

采用 #pragma weak name1 = name2 形式时,符号 name1 成为对 name2 的弱引用。如果没有在其他地方定义 name1,那么 name1 的值为 name2。如果在其他地方定义了 name1,那么链接程序使用该定义并忽略对 name2 的弱引用。以下指令指示链接程序解析对 bar(如果已在程序中某处定义)的任何引用,以及解析对 foo 的引用。


#pragma weak bar = foo

采用标识符形式时,必须在当前编译单元中声明和定义 name2。例如:


extern void bar(int) {...}
extern void _bar(int);
#pragma weak _bar=bar

使用字符串形式时,符号不需要预先声明。如果以下示例中的 _barbar 都是 extern "C",则不需要声明函数。但 bar 必须在同一对象中定义。


extern "C" void bar(int) {...}
#pragma weak "_bar" = "bar"

重载函数

使用标识符形式时,必须在 pragma 位置的作用域中正好有一个具有指定名称的函数。尝试将标识符形式 #pragma weak 用于重载函数会出现错误。例如:


int bar(int);
float bar(float);
#pragma weak bar        // error, ambiguous function name

要避免错误,请使用字符串形式,如以下示例所示。


int bar(int);
float bar(float);
#pragma weak "__1cDbar6Fi_i_" // make float bar(int) weak

有关更多信息,请参见 Solaris《链接程序和库指南》。