这个问题在这里已经有了答案:
C Typedef and Struct Question
(5 个回答)
6年前关闭。
我一直在使用“学习核心音频”一书中的一些示例代码,就像这样..
typedef struct MySineWavePlayer
{
AudioUnit outputUnit;
double startingFrameCount;
} MySineWavePlayer;
为什么此代码中的“MySineWavePlayer”两次?
最佳答案
这是一个常见问题,通过解释在定义结构时使用 typedef 和不使用 typedef 之间的区别来回答。
常见的成语是同时使用:typedef struct X { int x; } X;
它们是不同的定义。为了使讨论更清楚,我将拆分句子:
struct S { int x; };
typedef struct S S;
在第一行中,您定义了标识符
S
在结构 namespace 内(不是 C++ 意义上的)。您可以使用它并通过将参数的类型定义为 struct S
来定义新定义类型的变量或函数参数。 :void f( struct S argument ); // struct is required here
第二行添加了一个类型别名
S
在全局 namespace 中,因此您只需编写: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
定义后在第二行中,struct S 不能被编译器自动解析,并且要创建一个对象或定义该类型的参数,您必须回退到包含 struct 关键字:// previous code here...
int main() {
S();
struct S s;
}
source
关于objective-c - 为什么此 C 代码中的结构有两个名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27871457/