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

5 c c++ scope initialization global-variables

今天无意中在全局范围内声明了一个变量,并用函数调用的返回值对其进行了初始化。用visual studio 2015编译的代码没有问题,我很惊讶它确实如此。我去了一个在线 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;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

尽管 C++ 就其共享特性而言往往比 C 更严格(没有隐式声明、字符串字面量的隐式常量等),但使用非常量表达式在文件范围内初始化变量是一个全新的特性. 自从第一个标准问世以来,它就一直在该语言中。

该功能有些争议,因为对于不同翻译单元中的变量未指定初始化顺序。我怀疑这可能会导致标准委员会不愿为较新的 C 标准之一添加类似的功能。