在C ++中声明结构时使用typedef

时间:2010-12-12 09:58:04

标签: c++ coding-style

我个人不喜欢那种旧的C风格的结构声明:

typedef struct {} NewType;

ctags制作丑陋的anon类型并使调试变得困难。 C ++代码中是否有任何理由使用typedef结构而不是简单的struct,除了代码在C和C ++中使用?

此致 的Valentin

3 个答案:

答案 0 :(得分:3)

这是 C-ism 。在C中,结构和枚举有效地具有一个名称空间,因此对于

struct NewType {};
enum SomeEnum {};

你必须写struct NewTypeenum SomeEnum来引用。

在C ++中,这不是必需的。所以,除非你编写一个需要由C编译器解析的头文件,否则你不应该使用它。

答案 1 :(得分:3)

那些

的一个主要缺点
typedef struct tagSomethingSomething SomethingSomething;

是,使用常用的typedef'fed名称无法进行前向声明。

是的,它是 C-ism (kudos sbi)并且有c ++ - 代码库,不幸的是 - 它仍然很常见。

答案 2 :(得分:-1)

@sbi:我认为不是:可能是错的,但是...在C ++中它不是一个匿名结构,有一个特殊的规则称为“struct hack”,它使用typedef名称标记一个普通的struct,所以typedef name也成为类名。这是必需的,因为具有外部链接的函数需要类类型的参数也具有外部链接,这意味着具有外部名称。没有这个hack,只有extern“C”函数可以操作结构。

你可以使用匿名结构的唯一地方是另一个结构:

struct X { struct {int a; } b; } x;
x.b.a; // OK

即使b的类型是匿名的,struct X也有外部链接。匿名结构可以在堆栈或静态存储中使用,但与匿名联合不同,它不会提供优于单独变量的优势。我甚至不确定C ++是否允许使用匿名结构。