今天我不小心在全局范围内声明了一个变量,并用函数调用的返回值对其进行了初始化。使用 visual studio 2015 编译的代码没有问题,我很惊讶它确实如此。我去了一个在线 C 编译器,因为我没有,并尝试编译但失败并显示错误消息:
error: initializer element is not constant.
嗯,看到这个我很惊讶,因为自然地,C++ 不允许 VLA,这与 C11 不同。我的意思是,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 标准之一添加类似的功能。
关于c++ - 在 C 与 C++ 中使用函数调用初始化全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697096/