这里定义的是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++
那么,为什么声明用户定义类型的变量的区别呢?
答案 0 :(得分:5)
简短回答:因为这就是定义两种不同语言的方式。
更长的答案:在C中,enum
和typedef struct s s;
名称位于不同的不同名称空间中。这就是为什么你在C代码中看到很多struct
类型的东西,所以你不需要使用struct
。在C ++中,enum
和class
(和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 ++进行编译。
来自维基百科。