小编典典

typedef struct vs struct定义

all

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

struct myStruct{
    int one;
    int two;
};

对比

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

阅读 165

收藏
2022-02-28

共1个答案

小编典典

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

typedef struct S { 
    int x; 
} S;

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

struct S { 
    int x; 
};

typedef struct S S;

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

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

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

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

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

为了使差异更清楚:

typedef struct S { 
    int x; 
} T;

void S() { } // correct

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

您可以定义一个与结构同名的函数,因为标识符保存在不同的空间中,但您不能定义一个与 a 同名的函数,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;
}
2022-02-28