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

时间:2016-08-01 10:58:22

标签: c++ c scope initialization global-variables

今天我意外地在全局范围内声明了一个变量,并使用函数调用的返回值对其进行初始化。使用visual studio 2015编译的代码没有任何问题,我很惊讶它确实如此。我去了一个在线C编译器,因为我没有,并且尝试编译但是它失败并显示错误消息:

  

错误:初始化元素不是常量。

好吧,我很惊讶看到这一点,因为很自然,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;
}

1 个答案:

答案 0 :(得分:4)

虽然C ++的共享特性往往比C更严格(没有隐式声明,字符串文字的隐含常量等等),但是使用非const表达式对文件范围中的变量进行初始化是一个全新功能。自第一个标准问世以来,它一直是语言。

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