采用 #pragma weak name 形式时,指令使 name 成为弱符号。链接程序没有找到 name 的符号定义时,不会显示错误消息,也不会出现符号的多个弱定义的错误消息。链接程序仅执行第一个遇到的定义。
如果另一个编译单元有函数或变量的强定义,那么 name 将链接到它。如果没有 name 的强定义,那么链接程序符号的值为 0。
以下指令将 ping 定义为弱符号。链接程序找不到名为 ping 的符号的定义时,不会生成错误消息。
#pragma weak ping |
采用 #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 |
使用字符串形式时,符号不需要预先声明。如果以下示例中的 _bar 和 bar 都是 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《链接程序和库指南》。