埃及阿斯旺东宫:typedef 用法疑问

来源:百度文库 编辑:高考问答 时间:2024/04/27 14:26:48
typedef struct A A;

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;