这个问题在这里已经有答案了:
为什么我们要在C中如此频繁地键入定义结构?
(15个答案)
(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();
结构;
}