【发布时间】:2014-09-16 16:26:38
【问题描述】:
我在查看 Glew 的标题时遇到了一些问题:
// C
typedef struct __GLsync *GLsync;
我知道 Glew 是一个 C 库,因此与 C++ 不同,我知道这是 C++ 中的有效代码:
// C++
struct S { ... }; // S defined in the class name space
void f( S a ); // struct is optional
我的问题是,从 C++ 中的 typedef 中删除 struct 关键字并在仅限 C++ 的项目中包含标头是否安全?
typedef /*struct*/ __GLsync *GLsync;
如果不是,当我使用 struct 关键字和不使用关键字时,我执行 typedef 会有什么不同?
【问题讨论】:
-
为什么要删除它?
-
混合 C 和 C++ 代码的正确方法是使用“extern”。
-
为了更直接地解决您的问题 - 在 C++ 中,“struct”与“class”非常非常相似。但也有一些区别。如果你想要一个普通的旧 C 结构,“extern”。
-
前者(带有
struct)将编译不管__GLsync是否先前在同一个翻译单元中声明,声明指向某个结构类型的指针的typedef(可能不是那时已知)称为_GLsync。后者(没有struct)需要事先定义实际结构,否则会出现未知类型错误。 -
@3p3r 是的,类似的东西。您可以
typedef struct Something *SomeThingPtr;无需事先在翻译单元遇到Something。编译器会看到它,并简单地推断“我不知道这是什么,但我真的不需要知道来声明一个指针别名。”这与typedef Something *SomethingPtr;明显不同,后者必须事先了解Something是什么。当然,当任何代码实际尝试取消引用SomethingPtr时,Something的定义必须已经进入翻译单元。这在粉刺中很常见。