结构体的成员名和变量名不在同一命名空间中,编译器可以从语法上区分成员名和变量名,所以结构体的成员名和变量名可以取一样的,不冲突;
枚举类型的成员是常量,它们的值由编译器自动分配,从0开始,当然也可以人为选择不从0开始分配。枚举常量也是一种整形,其值在编译时确定,因此也可以出现在常量表达式中。枚举的成员名和变量名在同一命名空间,所以变量名和枚举的成员名不可以一样,会出现命名冲突。
编译器的工作分为两个阶段,预处理(preprocess)和编译阶段。用gcc 的-E选项可以看到预处理之后,编译之前的程序。用cpp命令也可以看到预处理之后,编译之前的程序。cpp的意思就是C preprocessor。宏定义以及#include都是在预处理阶段执行的。像这种以#号开头的行称为预处理指示。虽然include和define在预处理指示中有特殊的含义,但是它们并不是c语言的关键字,它们也可以用作标识符。在预处理阶段,如果一行以#开头,后面跟include或者define,预处理器就认为这是一条预处理指示。除此之外,出现在其他地方的include或者define预处理并不关心,只是当成普通标识符交给编译阶段去处理。
宏定义之后的变量不可以重新定义,会冲突。
版权声明:本文为u010141928原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。