Oracle® Solaris Studio 12.4:C++ 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

4.1 链接程序作用域

可使用下列声明说明符来协助约束 extern 符号的声明和定义。 文件链接到共享库或可执行文件之前,静态归档或对象文件指定的作用域限制不会生效。尽管如此,编译器仍然可以执行显示链接程序作用域说明符的某些优化。

通过使用这些说明符,您不必再使用链接程序作用域的 mapfile。也可以通过在命令行上指定 -xldscope 来控制变量作用域的缺省设置。

有关更多信息,请参见-xldscope={v}

表 4-1  链接程序作用域声明说明符
含义
__global
符号定义具有全局链接程序作用域,是限制最小的链接程序作用域。对符号的所有引用都绑定到定义符号的第一个动态装入模块中的定义。该链接程序作用域是 extern 符号的当前链接程序作用域。
__symbolic
符号定义具有符号链接程序作用域,其限制程度高于全局链接程序作用域。将对链接的动态装入模块内符号的所有引用绑定到模块内定义的符号。在模块外部,符号也显示为全局符号。该链接程序作用域对应于链接程序选项 -Bsymbolic。尽管不能将 -Bsymbolic 与 C++ 库一起使用,但可以使用 __symbolic 说明符,而不会引起问题。有关链接程序的更多信息,请参见 ld(1) 手册页。
__hidden
符号定义具有隐藏的链接程序作用域。隐藏链接程序作用域具有比符号和全局链接程序作用域更高的限制。将动态装入模块内的所有引用绑定到该模块内的定义。符号在模块外部是不可视的。

符号定义可以用更多限制的说明符来重新声明,但是不可以用较少限制的说明符重新声明。符号定义后,不可以用不同的说明符声明符号。

__global 是限制最少的作用域,__symbolic 是限制较多的作用域,而 __hidden 是限制最多的作用域。

因为虚函数的声明影响虚拟表的结构和解释,所以所有虚函数对包括类定义的所有编译单元必须是可视的。

可以将链接程序作用域说明符应用于 structclassunion 声明和定义中,因为 C++ 类可能要求生成隐式信息,如虚拟表和运行时类型信息。 在这种情况下,说明符后跟 structclassunion 关键字。这种应用程序为其所有隐式成员隐含了相同的链接程序作用域。