C++ 只为静态变量分配一次内存
可能重复:C++ 只为静态变量分配一次内存,c++,c,C++,C,可能重复: 我有以下代码: #include <stdio.h> #include <stdlib.h> int foo (int num, int i) { static int* array = malloc(sizeof(int)); // ERROR HERE!!! printf("%d", array[i]); return 0; } int main(int argc, char *argv[]) { int i;
我有以下代码:
#include <stdio.h>
#include <stdlib.h>
int foo (int num, int i)
{
static int* array = malloc(sizeof(int)); // ERROR HERE!!!
printf("%d", array[i]);
return 0;
}
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 2; i++) {
foo(i, i);
}
return 0;
}
但是,我把它保存为C++源文件,它工作正常。为什么?有人能解释一下吗?
你不能用C中的非常量初始化器初始化静态对象
static int* array = malloc(sizeof(int));
^ must be a constant
根据C标准:
(C99,6.7.8p4)“具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字。”
C(与C++不同)不允许使用非常量值初始化静态持续时间变量
static int* array = malloc(sizeof(int)); // ERROR HERE!!!
C99标准:第6.7.8节:
具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字
C和C++标准对代码的初始化采用了不同的代码:C++允许静态初始化(即,用常数初始化)和动态初始化(即用非常量表达式初始化),而C只允许静态初始化——即用常量表达式。
< > C++相关标准的部分为:7.7.4:
具有静态存储持续时间(3.7.1)的所有本地对象的零初始化(8.5)在进行任何其他初始化之前执行。POD类型(3.9)的本地对象的静态存储持续时间由常量表达式初始化,在其块首次输入之前初始化。[…]否则,当控件第一次通过其声明时,该对象将被初始化;此类对象在完成初始化后即被视为已初始化。(重点已添加)
C++需要额外的“簿记”,以便只运行一次初始值设定项的动态部分(即调用malloc
)。C标准中没有类似的“动态”规定:
所有具有静态存储持续时间的对象应在程序启动前初始化(设置为其初始值)。
具有静态存储持续时间的对象的初始值设定项中的所有表达式应为常量表达式或字符串文字
在没有并发性的情况下,您可以重写代码以便与C一起使用,如下所示:
int foo (int num, int i) {
static int* array = NULL;
if (!array) array = malloc(sizeof(int)); // No error
printf("%d", array[i]);
return 0;
}
现在你的代码负责“簿记”:在执行分配之前,检查<代码>数组<代码> null >代码> .< /p> 它是C中的ILGEL,但是C++中的OK,它们不同
可以写如下:
static int* array = NULL;
if (array == NULL)
array = malloc(sizeof(int));
这是因为C和C++是不同的语言。某些C++中的东西在C中是不好的,这是其中之一。
static int* array = NULL;
if (array == NULL)
array = malloc(sizeof(int));