在C和C ++中声明用户定义类型的不同方法

时间:2017-04-02 15:41:17

标签: c types

这里定义的是ANSI C中的枚举。

enum Security_Levels
{
    black_ops,
    top_secret,
    secret,
    non_secret
};

现在声明类型为Security_Levels的s [4],我在main()代码中写了这个

    Security_Levels s[4];

我收到了这个错误:

file.c: In function ‘main’:
file.c:13:3: error: unknown type name ‘Security_Levels’
Security_Levels s[4];

但是当我宣布这样的时候

enum Security_Levels s[4];

IT工作!

Security_Levels s[4];

这个^在C ++中工作但在C

中引发了上述错误

我在C和C ++中使用 struct 时也有类似的问题。

struct structure_name variable_name; //this is how it works in C
structure_name variable_name; // in  case of C++

那么,为什么声明用户定义类型的变量的区别呢?

2 个答案:

答案 0 :(得分:5)

简短回答:因为这就是定义两种不同语言的方式。

更长的答案:在C中,enumtypedef struct s s;名称位于不同的不同名称空间中。这就是为什么你在C代码中看到很多struct类型的东西,所以你不需要使用struct。在C ++中,enumclass(和typedef)名称是定义struct / enum(通常是全局名称空间)的名称空间的一部分。因此,您可以在没有this.running或关键字的情况下引用它们。

答案 1 :(得分:0)

以下函数将在C和C ++中返回不同的值:

extern int T;

int size(void)
{
    struct T {  int i;  int j;  };

    return sizeof(T);
    /* C:   return sizeof(int)
     * C++: return sizeof(struct T)
     */
}

这是因为C要求结构标签前面的结构(因此sizeof(T)引用变量),但C ++允许它被省略(因此sizeof(T)指的是隐式typedef)。请注意,当extern声明放在函数内部时结果是不同的:然后在函数作用域中存在具有相同名称的标识符会禁止隐式typedef对C ++生效,并且C和C ++的结果将是相同的。还要注意上面示例中的歧义是由于括号与sizeof运算符一起使用。使用sizeof T会期望T是表达式而不是类型,因此该示例不会使用C ++进行编译。

来自维基百科。