sizeof struct gcc编译成功,但g ++编译失败

时间:2016-06-01 13:32:29

标签: c++ struct g++

#include <stdio.h>

typedef struct test{
    int n;
    struct next{
        int x;
    }level[];
}test;

int main()
{
    printf(" %d \n", sizeof(struct next));
    return 0;
}

我有一个名为test.c的代码。 它是从c源代码复制而来的。当我用Gcc编译它时,它取得了成功。 但是当我用g ++编译它时,编译器会抱怨:

test.c: In function ‘int main()’:
test.c:12:37: error: invalid application of ‘sizeof’ to incomplete type ‘main()::next’
  printf(" %d \n", sizeof(struct next));

我搜索了很长时间,但没有结果。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

C和C ++是具有不同规则的不同语言。这是一个这样的例子,其中C ++并不是C的超集。

在C中,嵌套结构是同一个封闭命名空间的成员。因此sizeof(struct next)引用之前完全声明的类型next,其成员x,其大小为sizeof(int)。这是格式良好的代码。

在C ++中,嵌套类是封闭类的成员 - 因此struct next 引用test::next而是本地类型{{1}的前向声明在next的范围内。此类型不完整,因此您无法将main()应用于此类型。

当您使用gcc编译以sizeof()结尾的文件时,您将代码编译为C程序,因此它会成功。使用g ++编译时,您将代码编译为C ++程序,因此出错。

答案 1 :(得分:1)

如果您更改

之类的代码
#include <stdio.h>

struct test{
    int n;
    struct next{
        int x;
    }level[];
};

int main()
{
    printf(" %d \n", (int)sizeof(test::next));
    return 0;
}

它适用于C ++。我用g ++ 4.9

编译它