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

标签 c++ c scope initialization global-variables

今天我不小心在全局范围内声明了一个变量,并用函数调用的返回值对其进行了初始化。使用 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/

相关文章:

c++ - 为什么我会调用 implicitly_deleted 默认构造函数?

c - 循环使用 while

c - 禁用 clang-tidy 诊断

c++ - 函数不写入 txt 文件

c++ - C++ 中包含双 header ?

C 链表集(抽象数据类型)

javascript - 是否可以在 JavaScript 函数内从调用者的作用域访问变量?

javascript - typeof 创建具有未定义值的新变量(如果它不存在或不存在)

javascript - 对 'this' 的内部引用未在返回对象中解析

c++ - 合并枚举 C++