-qprocimported、-qproclocal 和 -qprocunknown

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qprocimported, -qproclocal, -qprocunknown
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

等效编译指示

表 2。 两个类别的调用的编译指示等效项
xlc/xlC 和其他遗留的调用命令 xlclang/xlclang + + 调用命令
#pragma 个选项 proclocal , #pragma 个选项proc导入, #pragma 个选项 procunknown

用途

将函数标记为 "本地" , "已导入" 或 "未知"。

局部函数与调用它们的函数静态地 绑定在一起;将为此类函数的调用生成 较小而运行较快的代码。 您可以使用 -qproclocal 选项或编译指示来命名编译器可以假定为本地的函数。

导入的函数动态地与库的共享 部分绑定在一起。 对标记为“已导入” 的函数调用生成的代码可能较大,但是其运行速度比对 标记为“未知”的函数生成的缺省代码序列更快。 您可以使用 -qprocimported 选项或编译指示来命名编译器可以假定要导入的函数。

在链接期间,将未知 函数解析为静态或动态绑定的对象。 您可以使用 -qprocunkown 选项或编译指示来命名编译器可以假定未知的函数。

语法

读取语法图跳过可视语法图 -q procunknownproclocalprocimported =:功能名称

缺省值

-qprocunkown: 编译器假定所有函数的定义都未知。

参数

function_name
编译器应假定为本地,导入或未知的函数的名称 (取决于指定的选项)。 如果未指定任何 function_name,那么编译器将假定 所有 函数都是本地函数,已导入函数或未知函数。

仅限 C + + 必须使用其别名来指代名字。 要获取 C++ 改编名称,请使用 -c 编译器选项仅将源代码编译为对象文件,并对生成的对象文件使用 nm 操作系统命令。 您还可以使用编译器提供的 c + + filt 实用程序来并排列出源名称和已管理的名称; 请参阅 Demangling 编译的 C++ 名称 以获取详细信息。 (另请参阅 名称修饰 以获取有关在声明上使用 extern "C" 链接说明符以防止名称修饰的详细信息。)

使用量

如果标记为本地解析共享库函数的任何函数,那么链接程序将检测错误并发出警告。 如果标记为导入的任何函数解析为静态绑定的对象,那么生成的代码可能比为未知函数生成的缺省代码序列更大,运行速度也更慢。

如果函数满足以下所有条件,那么编译器将发出一条警告消息以指示最终可执行文件可能丢失性能:
  • 具有本地定义。
  • 标记为已导入或未知。
  • IBM 扩展具有受保护、隐藏或内部可见属性。IBM 扩展

如果指定了多个不带函数名的选项,那么将使用指定的最后一个选项。 如果在多个选项规范上指定相同的函数名,那么将使用最后一个函数名。

预定义的宏

无。

示例

要编译 myprogram.c 以及归档库 oldprogs.a ,请执行以下操作:
  • 函数 funsun 指定为本地
  • 函数 moonstars 指定为已导入
  • 函数 venus 指定为未知
请使用以下命令:
xlc myprogram.c oldprogs.a -qprolocal=fun(int):sun()
  -qprocimported=moon():stars(float) -qprocunknown=venus()
如果以下示例 (在此示例中,标记为本地的函数将解析为共享库函数) 使用 -qproclocal进行编译:
int main(void) 
{ 
    printf("Just in function foo1()\n"); 
    printf("Just in function foo1()\n"); 
}
将导致链接程序错误。 要解决此问题,应显式地将调用的例程标记为从共享对象导入。 在这种情况下,您将重新编译源文件,并通过使用 -qproclocal -qprocimported=printf进行编译将 printf 显式标记为已导入。

相关信息