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

标签 objective-c c

这个问题在这里已经有了答案:





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/

相关文章:

java - char* (Array) 强制转换为 unsigned long + 1?

c - 在另一个文件中搜索一个文件的一部分

iphone - iOS后台音频链接器错误

ios - 如何使 Xcode 中的 Swift 文件编译成为可选?

iOS 7 后台传输服务在 3 分钟后停止

c - 当您不知道接收到哪个结构时如何从结构接收数据

javascript - 如何在字符串中间插入变量

iphone - CGImageCreateWithImageInRect 无法正常工作

c - c程序中数字前的静态

c - 为微型改进 Sprintf