gpt4 book ai didi

c - typedef 结构与结构定义

转载 作者:行者123 更新时间:2023-11-30 16:12:17 24 4
gpt4 key购买 nike

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

struct myStruct{
int one;
int two;
};

对比

typedef struct{
int one;
int two;
}myStruct;

最佳答案

常见的习惯用法是同时使用:

typedef struct S { 
int x;
} S;

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

struct S { 
int x;
};

typedef struct S S;

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

void f( struct S argument ); // struct is required here

第二行在全局命名空间中添加类型别名S,因此允许您编写:

void f( S argument ); // struct keyword no longer needed

请注意,由于两个标识符 namespace 不同,因此在结构体和全局空间中定义 S 并不是错误,因为它不是重新定义相同的标识符,而是在不同的地方。

为了让差异更清楚:

typedef struct S { 
int x;
} T;

void S() { } // correct

//void T() {} // error: symbol T already defined as an alias to 'struct S'

您可以定义一个与结构体同名的函数,因为标识符保存在不同的空间中,但您不能定义与 typedef 同名的函数,因为这些标识符会发生冲突。

在 C++ 中,情况略有不同,因为定位符号的规则发生了微妙的变化。 C++ 仍然保留两个不同的标识符空间,但与 C 不同的是,当您仅在类标识符空间内定义符号时,不需要提供 struct/class 关键字:

 // C++
struct S {
int x;
}; // S defined as a class

void f( S a ); // correct: struct is optional

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

之前提供的代码的行为方式相同:

typedef struct S { 
int x;
} T;

void S() {} // correct [*]

//void T() {} // error: symbol T already defined as an alias to 'struct S'

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

// previous code here...
int main() {
S();
struct S s;
}

关于c - typedef 结构与结构定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58362999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com