gpt4 book ai didi

c++ - 为什么 C 和 C++ 中结构初始化的这种不同行为?

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:17 24 4
gpt4 key购买 nike

代码:

#include <stdio.h>

typedef struct{
int i;
int tab[];
}mystr;

mystr a = {1,{0,1,2}};

int main(void){
printf("%d%d%d\n",a.i,a.tab[0],a.tab[1]);
return 0;
}

C 编译:

$ gcc main.c -o main && ./main
101

C++ 编译:

$ g++ main.c -o main && ./main
main.c:8:27: error: too many initializers for ‘int [0]’
const mystr a = {1,{0,1,2}};
^

我明白问题所在,tab 没有分配任何内存。但是为什么这对 C 没问题呢?为什么 C++ 不会自动为 tab 分配内存空间?我知道结构类似于 C++ 中的对象,但可能存在一些我不知道的关于全局对象实例化的微妙之处?

最佳答案

该代码在C中是无效的,这在C中是不允许的

typedef struct{
int i;
int tab[];
}mystr;

mystr a = {1,{0,1,2}};

无论您在 C 模式下观察到什么行为,都是编译器的怪癖,与语言无关。编译器支持将代码作为非标准功能,扩展

您的代码在 C++ 中也是无效的,但原因与您的编译器报告的完全不同。在 C++ 中,根本不允许将 [] 数组作为类成员。编译器允许它通过(再次作为扩展),但稍后在另一个位置失败。

因此,您的问题的答案是:您使用的编译器在 C 模式下与在 C++ 模式下有不同的怪癖/扩展。这并不奇怪,因为它们是非常不同的语言。

关于c++ - 为什么 C 和 C++ 中结构初始化的这种不同行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53416375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com