可能是一些 C 技巧。喜欢他们的课。看起来广告已经在那里了。也许这就是为什么?例如,这是一行(来自 OpenCV):
typedef struct CvFileStorage CvFileStorage;
为什么要这样写?我没有立即找到任何方法来解决这个问题。曾经(几年前),我记得读过它。当时纯 C 可能很流行,但现在已经忘记了。我在 Windows CE6 和其他人的代码中也看到了类似的东西。我记得它:),但我不记得为什么我需要它。如果有任何额外的 应该带段代码,然后告诉我。此行位于在其字段中某处使用来自此 typedef 的类型的结构之前。但为什么要这样写而不只是声明呢?谢谢你。
在C++中,如果要声明一个struct类型的变量,只需要写上类型名和变量即可。在纯 C 中,情况并非如此。而且你应该总是写结构。这都是因为结构的类型和其他类型,可以说,在不同的范围内。但是既然程序员是懒惰的生物,还是写一个名字比较好
然后不要考虑为什么它不能编译(因为他们忘记了结构)或者为什么它以一种奇怪的方式工作(因为他们忘记了结构,并且有人声明了他们的类型,而不是同名的结构)。
但他们往往写得更有趣:
在这种情况下,一切都以与普通 C++ 中通常相同的方式立即创建。
如果没有这个
typedef,任何提及的结构都CvFileStorage必须完整地写出来:等等。如果有声明,这个
typedef词struct可以扔掉:声明此 typedef 至少有两个充分的理由。
第一个原因是在 C 程序中,您必须将关键字
structor放在enum结构或枚举的名称之前。输入代码时看起来很繁琐。很多时候,程序员会忘记指定这些词,从而导致编译错误。因此,typedef通过允许程序员不在结构或枚举的名称之前写这些关键字,这让程序员的生活更轻松。第二个原因是结构名称和其他标识符在不同的名称空间中。因此,可以使用相同的名称来声明一个结构和一个普通变量。例如下面的代码片段是正确的
此代码片段声明了一个具有相同名称的结构
CvFileStorage和一个具有相同名称的类型变量int。这些声明彼此不冲突,因为正如已经写过的那样,结构名称必须以关键字开头struct。例如,您可以在 C 中编写
这个声明是正确的,因为三个匹配的标识符在不同的命名空间中。
然而,这可能会误导代码的读者,因为如果程序员错误地省略了
struct结构名称前的关键字,那么从语言语法的角度来看,代码可能仍然是正确的,虽然结构实际上是指,而不是同名变量。例如,在这个表达式中,程序员无意中忘记了指定关键字
struct,但仍然收到了正确的表达式,因为有一个同名变量为避免此类混淆,建议在保留此名称时不要
struct为结构名称添加关键字,使用typedef..struct在 C++ 中,引用结构时可以省略关键字。那么问题来了:在 C 中你可以声明一个与结构名称同名的变量或函数呢?此问题通过以下方式解决:变量名或函数名隐藏同名结构的声明。因此,在引用结构时,必须指定限定名。
例如,
在此代码片段中,函数声明隐藏了同名的结构声明。因此,例如,如果要声明此结构的对象,则需要指定结构的限定名称。
或者,例如,您可以编写这样的声明
这些名称不会相互冲突,因为限定名称用于结构。