C++ 在C与C+中使用函数调用初始化全局变量+;

C++ 在C与C+中使用函数调用初始化全局变量+;,c++,c,scope,initialization,global-variables,C++,C,Scope,Initialization,Global Variables,今天,我意外地在全局范围中声明了一个变量,并用函数调用的返回值初始化了它。用VisualStudio2015编译的代码没有问题,我很惊讶它能做到。我去了一个在线C编译器,因为我没有,并试图编译,但失败了,错误消息如下: 错误:初始值设定项元素不是常量 嗯,我很惊讶看到这个,因为自然地,C++不允许VLA不同于C11。我的意思是C++比C.更严格。 为什么C++中允许这样,而不是在C?< /P>中? #include <stdio.h> #include <string.h>

今天,我意外地在全局范围中声明了一个变量,并用函数调用的返回值初始化了它。用VisualStudio2015编译的代码没有问题,我很惊讶它能做到。我去了一个在线C编译器,因为我没有,并试图编译,但失败了,错误消息如下:

错误:初始值设定项元素不是常量

<>嗯,我很惊讶看到这个,因为自然地,C++不允许VLA不同于C11。我的意思是C++比C.

更严格。

为什么C++中允许这样,而不是在C?< /P>中?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *G_ptr = (char *)malloc(1000);

int main(void)
{
    strcpy(G_ptr, "Hello, World");
    puts(G_ptr);
    return 0;
}
#包括
#包括
#包括
char*G_ptr=(char*)malloc(1000);
内部主(空)
{
strcpy(G_ptr,“你好,世界”);
看跌期权(G_ptr);
返回0;
}

虽然C++的共享特性(没有隐式声明,字符串字符串的隐含常量),但是C语言往往比C更严格,但是用非const表达式初始化文件范围内的变量是一个全新的特性。自从第一个标准出台以来,它就一直使用这种语言


该特性有点争议,因为不同转换单元中的变量的初始化顺序未指定。我怀疑这可能会导致标准委员会不愿将一个类似的特性添加到一个较新的C标准中。

因为C++允许,而C不允许。不确定您期望的是什么“这就是它的方式”。值得一提的是:如果您这样做,请小心变量之间的依赖关系。你无法控制他们的初始化顺序,很容易搞得一团糟。如果你进入这种情况,调试很难,因为它甚至在到达主程序之前会崩溃。作为猜测,我认为它是在C++中而不是C中允许的,因为C++对象的构造函数需要运行。“静态范围”?你是说“文件范围”我猜。。。C中没有这样的“静态范围”。