|
发表于 2010-9-25 14:10:39
|
显示全部楼层
本帖最后由 VBProFan 于 2010-9-25 16:12 编辑
一次写程序时:
struct ProgramLink
{
struct ProgramLink * next;
U32 ProgId;
}
BOOL time_cross_prog(...)
紧接着struct声明的后面的是另一个函数的声明:
郁闷的是,编译通不过:“two or more data types in declaration of `time_cross_prog'”
我以为是 BOOL 的问题,在程序段的最前面加了句 #define BOOL char 不行,直接写 char 不行,写 int 也不行。
后来才发现竟然是struct定义的最后面的分号忘记写了!真是气愤至极。于是乎拿起 C 的产生式来研究,以加深印象。
declaration → declaration_specifiers ‘;’ | declaration_specifiers init_declarator_list ‘;’
declaration_specifiers → storage_class_specifier | storage_class_specifier declaration_specifiers | type_specifier | type_specifier declaration_specifiers | type_qualifier | type_qualifier declaration_specifiers | function_specifier
| function_specifier declaration_specifiers
type_specifier → VOID | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | SIGNED | UNSIGNED | BOOL | COMPLEX | IMAGINARY | struct_or_union_specifier | enum_specifier | TYPE_NAME
struct_or_union_specifier → struct_or_union IDENTIFIER '{' struct_declaration_list '}'
| struct_or_union '{' struct_declaration_list '}' | struct_or_union IDENTIFIER
struct_or_union → STRUCT | UNION
只看红字和黑体部分,得到:
declaration → declaration_specifiers ‘;’
→ type_specifier‘;’
→ struct_or_union_specifier‘;’
→ struct_or_union IDENTIFIER '{' struct_declaration_list '}'‘;’
→ STRUCT IDENTIFIER '{' struct_declaration_list '}'‘;’
但我很快发现,既然 struct_or_union_specifier 和 INT 一样,都是用于声明变量的数据类型,既然 struct 定义时可以不声明具体变量,那么 int 为什么不行呢?
观察产生式,
如果
type_specifier → struct_or_union_specifier
这一步改为
type_specifier → INT
那结果不就是 int;
了吗?
于是赶快在 VC6 和 Linux 下的 gcc 分别做了个实验,结果…… |
|