代码:
#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++ 模式下有不同的怪癖/扩展。这并不奇怪,因为它们是非常不同的语言。
我是一名优秀的程序员,十分优秀!