#pragma weak name1 [= name2] |
可使用 weak 定义弱全局符号。该 pragma 主要在源文件中用于生成库。链接程序在不能解决弱符号时不会发出警告。
weak pragma 可以按以下两种形式之一来指定符号:
字符串形式。字符串必须是 C++ 变量或函数的损坏名称。无效损坏名称引用的行为是不可预测的。后端可以或不可以产生无效损坏名称引用的错误。无论是否产生错误,使用无效损坏名称时后端的行为都是不可预测的。
标识符形式。标识符必须是在编译单元中以前声明的 C++ 函数的明确标识符。标识符形式不能用于变量。前端 (ccfe) 遇到无效的标识符引用时会生成错误消息。
采用 #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《链接程序和库指南》。