c11标准6.7.2.3标签特定类型的内容最多应定义一次

时间:2017-03-19 11:04:28

标签: c gcc c11

我的代码在

下面
1 #include <stdio.h>                                                          
2 int main(void)
3 {
4         union test1 {
5                 int a;
6         };
7 
8         union test1 {
9                 int a;
10         };
11 
12         return 0;
13 }

编译错误:

4.c: In function ‘main’:
4.c:8:15: error: redefinition of ‘union test1’
    union test1 {
          ^
4.c:4:15: note: originally defined here
    union test1 {
          ^

我的问题是

Q1:
错误信息说重新定义,
在我看来,下面的代码应该是声明 为什么要重新定义?
为什么不重新声明?

4         union test1 {
5                 int a;
6         };

Q2:
根据c11标准

  

6.7.2.3标签特定类型的内容最多应定义一次。

最多一次===&gt;&gt;&gt;我的代码有两次,所以发生了错误。 “特定类型” 下面是代码包类型?

union test1 {
           int a;
};

1 个答案:

答案 0 :(得分:0)

您已正确理解定义和声明。请参阅问题What is the difference between a definition and a declaration?的答案。您会看到union test1;是一个声明,但union test1 {int a;};是一个定义。

此外,您在函数内定义了union。这不是一个好主意。所以,你很可能想要这样做:

#include <stdio.h>                                                          

union test1 {
        int a;
};

int main(void)
{
        return 0;
}

......或者这个:

#include <stdio.h>                                                          

int main(void)
{
        union {
            int a;
        } test1;

        union {
            int a;
        } test2;

        return 0;
}

如果你真的想要两个声明(和一个定义),你可以这样做:

#include <stdio.h>                                                          

union test1;

union test1;

union test1 {
        int a;
};

int main(void)
{
        return 0;
}