typedef结构与结构定义[重复]

这个问题在这里已经有答案了
为什么我们要在C中如此频繁地键入定义结构?

(15个答案)

五年前关闭的

我是C编程的初学者,但我想知道在定义结构时使用typedef与不使用typedef有什么区别。在我看来,这真的没有什么区别,他们实现了相同的目标

struct myStruct{
int-one;
int-2;
};

vs

类型定义结构{
int-one;
int-2;
}我的结构;

常见的习惯用法是同时使用以下两种语言:

typedef结构{
int x;
}S;

它们是不同的定义。为了让讨论更清楚,我将分句:

结构{
int x;
};
类型定义结构;

第一行中,在结构名称空间内定义标识符S/(不在C++意义上)。通过将参数类型定义为struct S,可以使用它并定义新定义类型的变量或函数参数:

void f(结构参数);//这里需要struct

第二行在全局名称空间中添加了一个类型别名S,因此您只需编写:

void f(S参数);//不再需要struct关键字

请注意,由于两个标识符名称空间不同,因此在结构和全局空间中定义S不是错误,因为它不是重新定义相同的标识符,而是在不同的位置创建不同的标识符

为了使区别更加明确:

typedef结构{
int x;
}T;
void S(){}//正确
//void T(){}//错误:符号T已定义为“struct S”的别名

当标识符保存在不同的空间中时,可以使用相同的结构名称定义函数,但当标识符发生冲突时,不能使用与typedef相同的名称定义函数

在C++中,它稍微不同,因为定位符号的规则已经微妙地改变了。C++仍然保留两个不同的标识符空间,但是与C不同,当您只在类标识符空间中定义符号时,不需要提供结构/类关键字:

>代码> /C++
结构S{
int x;
}; // 它被定义为一个类
无效f(S a);//正确:struct是可选的

什么样的变化是搜索规则,而不是定义标识符的位置。编译器将搜索全局标识符表,在未找到S后,它将在类标识符中搜索S

前面介绍的代码的行为方式相同:

typedef结构{
int x;
}T;
void S(){}//正确[*]
//void T(){}//错误:符号T已定义为“struct S”的别名

在第二行定义了S函数后,编译器无法自动解析结构S,要创建对象或定义该类型的参数,必须返回到包含struct关键字:

//前面的代码在这里。。。
int main(){
S();
结构;
}

发表评论