跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:C++ 用户指南 Oracle Solaris Studio 12.3 Information Library (简体中文) |
可使用下列声明说明符来协助约束外部符号的声明和定义。文件链接到共享库或可执行文件之前,静态归档或目标文件指定的作用域限制不会生效。尽管如此,编译器仍然可以执行显示链接程序作用域说明符的某些优化。
通过使用这些说明符,您不必再使用链接程序作用域的 mapfile。也可以通过在命令行上指定-xldscope 来控制变量作用域的缺省设置。
有关更多信息,请参见A.2.130 -xldscope={v}。
表 4-1 链接程序作用域声明说明符
|
符号定义可以用更多限制的说明符来重新声明,但是不可以用较少限制的说明符重新声明。符号定义后,不可以用不同的说明符声明符号。
__global 是限制最少的作用域,__symbolic 是限制较多的作用域,而 __hidden 是限制最多的作用域。
因为虚函数的声明影响虚拟表的结构和解释,所以所有虚函数对包括类定义的所有编译单元必须是可视的。
可以将链接程序作用域说明符应用于结构、类、联合声明和定义中,因为 C++ 类可能要求生成隐式信息,如虚拟表和运行时类型信息。在这种情况下,说明符后跟结构、类或联合关键字。这种应用程序为其所有隐式成员隐含了相同的链接程序作用域。
为了在动态库方面与 Microsoft Visual C++ (MSVC++) 中的相似作用域功能兼容,也支持以下语法:
|
在 Oracle Solaris Studio C++ 中使用此语法时,应将选项 -xldscope=hidden 添加到 CC 命令行。结果与使用 MSVC++ 得到的结果相当。在 MSVC++ 中,__declspec(dllimport) 应当仅用于外部符号的声明,而不用于定义。示例:
__declspec(dllimport) int foo(); // OK __declspec(dllimport) int bar() { ... } // not OK
在 MSVC++ 中,对于将 dllimport 用于定义没有严格规定,而使用 Oracle Solaris Studio C++ 时结果则不同。尤其是,使用 Oracle Solaris Studio C++ 时将 dllimport 用于定义得到的是具有全局链接的符号而不是符号链接。Microsoft Windows 上的动态库不支持符号的全局链接。如果遇到此问题,可以更改源代码,对定义使用 dllexport 而不是 dllimport。这样,使用 MSVC++ 和使用 Oracle Solaris Studio C++ 得到的结果相同。