变量的顺序是由标准定义的吗?

时间:2010-12-08 11:41:03

标签: c db2

请参阅以下内容:

static char start_marker;
static int var_1;
static int var_2;
/* ... */
static int var_n;
static char end_marker;

我想初始化该部分中的所有变量。以下代码是否有效?

memset(&start_marker, 0, &end_marker-&start_marker);

请注意,我不能在这里使用struct,因为这些字段被db2预处理器用作所谓的主机变量。

6 个答案:

答案 0 :(得分:4)

不,它无效。编译器可以根据需要布置全局和静态。

答案 1 :(得分:2)

首先 - 通过C标准静态变量预初始化为零 - 几乎是FAQ,Static variable initialization?

如果您只需要零初始化静态,那么您无需做任何事情。

如果您想要在一个过程中稍后将某一批静态变量归零,和/或要求将所述批次预初始化为特定的其他值,则必须指示链接器 (而不是编译器)将这些变量放入特定的已知地址。这被称为“部分”,并且这些部分可以通过链接器脚本来控制 见这里的例子:

http://www.math.utah.edu/docs/info/ld_3.html#SEC18

这说明了默认初始化代码的工作原理。

如果是特殊部分,您甚至可以让链接器使用地址创建/填充符号(指针)。在您的C / C ++代码中,您需要extern void* varblkaddr; extern size_t varblksize,并且实际上让链接器脚本创建具有这些名称的变量,并为您初始化为您选择的地址。

实际上,stackoverflow是一个很好的资源。这应该有所帮助:

Fixed address variable in C

答案 2 :(得分:1)

您的代码不仅仅依赖于订单而且还依赖于连续性:我在这里既不保证。

但是,您应该考虑将所有这些变量分组到struct

答案 3 :(得分:1)

正如其他人所说,静态存储持续时间的变量总是被初始化。如果您没有提供显式初始值设定项,则会将它们初始化为零。

如果您希望稍后可以使用memset将它们全部重置为零,则需要将它们全部放在struct中。否则他们的位置是独立的。

请记住,从标准的角度来看,memset为零不需要与零初始化相同。允许空指针和浮点零值具有除全零位之外的表示。在实践中,这是一个愚蠢的自由,标准给出了实现,你永远不会在现代世界中遇到这样的实现,所以我会忽略(非)问题。

答案 4 :(得分:0)

不,您无法保证以特定方式订购,也不保证它们在内存中是连续的。

如果要初始化它们,请使用:

void initVars() {
    start_marker = 0;
    var_1 = 0;
    var_2 = 0;
    /* ... */
    var_n = 0;
    end_marker = 0;
}

答案 5 :(得分:0)

不要这样做,一般来说这只是无用且容易出错。具有静态分配的变量从一开始就初始化为0。无需初始化它们。此外,编译器选择正确的0来执行此操作,例如0.0用于双精度或空指针常量用于指针等。

如果你想为你和代码的读者清楚地说明你可以给它一个明确的初始化程序,例如

static int var_1 = { 0 };

这个后备初始化程序应该始终有效。更好的是,如果你有一个C99兼容的编译器,有指定的初始化器:

static int arr[3] = { [0] = 0, [1] = 42,  };

默认情况下,初始化程序中未提及的字段再次默认初始化为0,例如元素arr[2]

所有这些显式初始化都适用于静态分配的变量或堆栈变量(auto)。 memset经常用于此目的。memset。只需让编译器为您完成。在最糟糕的情况下,他只会做一个{{1}},但他常常有一个更聪明的方法来做。{/ p>