-qinitauto

适用的调用

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

类别

错误检查和调试

等效编译指示

表 2。 两个类别的调用的编译指示等效项
xlc/xlC 和其他遗留的调用命令 xlclang/xlclang + + 调用命令
#pragma 选项 [no] initauto

用途

将未初始化的自动变量初始化为特定值,以便进行调试。

语法

读取语法图跳过可视语法图 -q noinitautoinitauto=hex_value

缺省值

-qnoinitauto

参数

hex_value
1 到 8 位十六进制数字。
  • 要将存储器的每个字节初始化为特定值,请为 hex_value 指定一位数或两位数。
  • 要将存储器的每个词初始化为特定值,请为 hex_value 指定 3 到 8 位数字。
  • 如果为请求的初始化方法的大小指定的位数小于最大位数,那么将采用前导零。
  • 在词初始化的情况下,如果自动变量的长度小于 4 字节的倍数,那么 hex_value 将在左侧截断以适应。 例如,如果自动变量仅为 1 字节,并且您为 hex_value指定了五位数字,那么编译器将截断左边的三位数字,并将右边的其他两位数字分配给该变量。 请参阅 示例 1
  • 如果自动变量的长度大于 hex_value ,那么编译器会重复 hex_value 并将其分配给该变量。 请参阅 示例 1
  • 如果自动变量是数组,那么会将 hex_value 以重复模式复制到数组的内存位置,从数组的第一个内存位置开始。 请参阅示例 2
  • 可以将字母数字指定为大写或小写。
  • hex_value 可以选择以 0x作为前缀,其中 x 不区分大小写。

使用量

-qinitauto 选项提供以下优点:
  • hex_value 设置为零可确保在使用所有自动变量 在声明时未显式初始化的 之前将其清除。
  • 可以使用此选项将实数或复数类型的变量初始化为信令或安静 NaN ,这有助于在程序中找到未初始化的变量。

此选项生成额外的代码以初始化自动变量的值。 它降低了程序的运行时性能,仅用于调试目的。

限制:
  • 不会单独初始化等价的对象、结构组件和数组元素。 而是整体地初始化整个存储序列。
  • -qinitauto=hex_value 选项不会初始化可变长度数组或通过 __alloca 函数分配的内存。

预定义的宏

  • __INITAUTO__ 定义为在 -qinitauto 选项或编译指示上指定的 hex_value最低有效字节 ; 否则,将取消定义。
  • __INITAUTO_W__ 定义为字节 hex_value,重复四次,或者定义为单词 hex_value(在 -qinitauto 选项或编译指示上指定); 否则未定义。
例如:
  • 对于选项 -qinitauto=0xABCD, __INITAUTO__ 的值为 0xCDu,而 __INITAUTO_W__ 的值为 0x0000ABCDu。
  • 对于选项 -qinitauto=0xCD, __INITAUTO__ 的值为 0xCDu,而 __INITAUTO_W__ 的值为 0xCDCDCDCDu。

示例

示例 1: 使用 -qinitauto 选项来初始化标量类型的自动变量。

#include <stdio.h>

int main() 
{
  char a;
  short b;
  int c;
  long long int d;

  printf("char a = 0x%X\n",(char)a);
  printf("short b = 0x%X\n",(short)b);
  printf("int c = 0x%X\n",c);
  printf("long long int d = 0x%llX\n",d);
}

例如,如果使用 -qinitauto=AABBCCDD编译程序,那么结果如下所示:

char a = 0xDD
short b = 0xFFFFCCDD
int c = 0xAABBCCDD
long long int d = 0xAABBCCDDAABBCCDD

示例 2: 使用 -qinitauto 选项来初始化自动数组变量。

#include <stdio.h>
#define ARRAY_SIZE 5

int main() 
{
  char a[5];
  short b[5];
  int c[5];
  long long int d[5];
  
  printf("array of char: ");
  for (int i = 0; i<ARRAY_SIZE; i++)
    printf("0x%1X ",(unsigned)a[i]);
  printf("\n");

  printf("array of short: ");
  for (int i = 0; i<ARRAY_SIZE; i++)
    printf("0x%1X ",(unsigned)b[i]);
  printf("\n");

  printf("array of int: ");
  for (int i = 0; i<ARRAY_SIZE; i++)
    printf("0x%1X ",(unsigned)c[i]);
  printf("\n");

  printf("array of long long int: ");
  for (int i = 0; i<ARRAY_SIZE; i++)
    printf("0x%1X ",(unsigned)d[i]);
  printf("\n");
}

例如,如果使用 -qinitauto=AABBCCDD编译程序,那么结果如下所示:

array of char: OxAA OxBB OxCC OxDD OxAA
array of short: OxAABB OxCCDD OxAABB OxCCDD OxAABB
array of int: OxAABBCCDD OxAABBCCDD OxAABBCCDD OxAABBCCDD OxAABBCCDD
array of long long int: 0xAABBCCDDAABBCCDD 0xAABBCCDDAABBCCDD 0xAABBCCDDAABBCCDD 
0xAABBCCDDAABBCCDD 0xAABBCCDDAABBCCDD