-qinitauto
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qinitauto | ✓ | ✓ | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
| xlc/xlC 和其他遗留的调用命令 | xlclang/xlclang + + 调用命令 |
|---|---|
| #pragma 选项 [no] initauto | 无 |
用途
将未初始化的自动变量初始化为特定值,以便进行调试。
语法
缺省值
-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
