埃及阿斯旺东宫:typedef 用法疑问
来源:百度文库 编辑:高考问答 时间:2024/04/27 14:26:48
struct A
{
//...
};
这种typedef的用法有问题吗?
typedef struct A A; 中, struct A 还没有声明呢.
正确的用法是不是应该这样呢?
struct A
{
//...
};
typedef struct A A;
把typedef struct A A;放在结构声明的后边.
但我网上说前一种也可以,C编译器是允许的,哪里有比较权威的说法呢.
我在我们的代码种也看到了前一种用法.可以用.
有些纳闷!
1.typedef是声明而非定义。所谓声明,就是预先通知编译器,在遇到某种情况下怎么处理。编译器接受声明时,只会检查这个声明本身是否“符合该声明的规范”,并不会去核对这个声明是否“合理”。
事实上,即使把真正的结构声明去掉:
typedef struct stucture_a STRUCTURE_A;
//整个程序中没有关于structure_a类型的声明structure sturcture_a{...};
也是符合ANSI标准的.所以楼主说的两种方法都是ok的。
2.上面说到“符合该声明的规范”,关于typedef的规范:根据“c in a nutshell”上的介绍,
typedef [type] [declarator];
中的type可以是:
A basic type
The type void
An enumerated, structure, or union type
A name defined by a previous typedef declaration
注意第三行中的structure,并没有说一定要是前面已经定义的。
3.遵循ANSI标准的编译器在遇到
typedef [type] [declaration]
时,如果type是已知的数据类型(包括结构、枚举等),编译器仅仅“记录”下这个声明备用。但是如果type是一个其他的标志符,编译器将向前搜寻,看该标志符是否在以前由另一个typedef语句定义过。如果没定义过,则报错。
4.上面的第三条是我个人的理解,仅供参考,不是权威解释!
5.尽管两种方法都没有错,但是我觉得好的编程风格应该一贯遵循“先定义后使用”。
有些编译器可能会对某些正确的程序给出警告,因为这些程序不符合好的风格(比如把整型变量赋给指针变量,虽然没有错,有些编译器仍会给出警告)
6.所以我比较喜欢
typedef struct{
...
}A;
的做法。
我一般写成
typedef struct struct_a{
};
struct_a b;的说
刚才编译了一下,的确都可以
实用就行了
不过个人感觉把typedef struct A A;放后边正式一点
最终还得看以下C95标准才能确定
这种问题试一下就知道了,没必要问。实际上是都可以的。
可以这样
typedef struct {
...
} A;
使用时这样定义:
A a1, a2;