Objective c 为什么C代码中的结构有两个名称?

Objective c 为什么C代码中的结构有两个名称?,objective-c,c,Objective C,C,我一直在使用《学习核心音频》一书中的一些示例代码,如下所示 typedef struct MySineWavePlayer { AudioUnit outputUnit; double startingFrameCount; } MySineWavePlayer; 为什么“myLineWavePlayer”在这段代码中出现了两次?在这种情况下,第一个实际上不需要,第二个用于typedef,如果您编写此代码的话 struct MySineWavePlayer { AudioUnit

我一直在使用《学习核心音频》一书中的一些示例代码,如下所示

typedef struct MySineWavePlayer
{
  AudioUnit outputUnit;
  double startingFrameCount;
} MySineWavePlayer;

为什么“myLineWavePlayer”在这段代码中出现了两次?

在这种情况下,第一个实际上不需要,第二个用于
typedef
,如果您编写此代码的话

struct MySineWavePlayer
{
  AudioUnit outputUnit;
  double startingFrameCount;
};
然后需要执行类似的操作来声明struct的实例

struct MySineWavePlayer mySineWavePlayer;
你可以这样做

typedef struct MySineWavePlayer MySineWavePlayer;
然后宣言就会变成

MySineWavePlayer mySineWavePlayer;
原来的那个

typedef struct MySineWavePlayer
{
  AudioUnit outputUnit;
  double startingFrameCount;
} MySineWavePlayer;
是一个组合,如果这些

您甚至可以对匿名结构执行
typedef

typedef struct
{
  AudioUnit outputUnit;
  double startingFrameCount;
} MySineWavePlayer;

因此,简短的回答是第一个
mylinewaveplayer
struct
的名称,第二个是
typedef
d类型的名称。

这是一个常见的问题,通过解释定义结构时使用typedef与不使用typedef之间的区别来回答

常见的习惯用法是同时使用两种语言:
typedef struct X{int X;}X

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

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'
您可以使用相同的结构名称定义函数,因为标识符保存在不同的空间中,但不能使用与typedef相同的名称定义函数,因为这些标识符发生冲突

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

 // 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关键字:

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

< /P>谁在问< C++ > C++ >代码>?除了C++风格的注释之外,这是C++ C OOPS刚刚看到的下半部分,它解释了C++的微妙之处。从未mind@ArlieStephens如果这是C++,整个问题就没有意义,因为在C++中你不需要<代码> TyPulfF。@ IHAROB:问题不是C++,没错,但是我认为C和C++中的不同行为值得解释。OP的问题已经得到了解答,C++部分只是额外的信息。在技术上,除非你声明了一个匿名结构,否则就需要第一个。如果要手动编写

struct S myStruct
,则不能再这样做。如果要编写
struct S myS,那么为什么要执行
typedef
则不需要
类型定义
。这将是非感官的是,但会改变编码器的一种能力。唯一需要的实际示例是几年前我使用过的一个旧的C89之前的示例,它不喜欢上面的类型定义的结构定义。