今天我意外地在全局作用域中声明了一个变量,并用函数调用的返回值对其进行了初始化。使用visualstudio2015编译的代码没有问题,我很惊讶它确实做到了。我去了一个在线C编译器,因为我没有,并试图编译,但失败了,错误消息是:
错误:初始值设定项元素不是常量。
好吧,我很惊讶看到这一点,因为C++自然不允许像C11那样的VLA。我的意思是,C++往往比C.更严格
为什么这在C++中是允许的,而在C中却不允许?
#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;
}
尽管C++在共享功能方面往往比C更严格(没有隐式声明、字符串文字的隐式常量等),但在文件范围内使用非常量表达式初始化变量是一项全新的功能。自从第一个标准问世以来,它就一直在语言中。
该功能有点争议,因为不同转换单元中的变量的初始化顺序是未指定的。我怀疑这可能会导致标准委员会不愿在一个较新的C标准中添加类似的功能。