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++ - c++ 中的 gcc 浮点指针转换导致 SIGBUS 错误

c++ - 如何仅根据第二个字符串对字符串 vector 的 vector 进行排序

c - C中使用指针从字符串中提取子字符串

无法访问结构 ifreq

c - 读取 GPIOB_IDR 寄存器时的值不正确

javascript - 范围:在 JavaScript 中将局部变量传递给全局变量

javascript - Angular.js - 在 Controller 中等待服务从服务器返回值

c++ - 无法将 std::bind 与可变模板参数一起使用

c - 在 objective-c 类中定义的 c 函数的范围是什么?

C++17无匹配函数调用减少错误