【问题标题】:typedef with a forward declaration side-effect?typedef 具有前向声明的副作用?
【发布时间】:2012-07-08 13:15:07
【问题描述】:

我在头文件中有以下声明:

struct my_struct;
int func(struct my_struct* s);        // Passing struct my_struct*

如果没有前向声明,编译器显然会给出this error

error: 'struct my_struct' declared inside parameter list

但是,如果我用 typedef 替换 my_struct 的前向声明,并相应地更新函数声明,它 compiles fine:

typedef struct my_struct my_struct_t;
int func(mystruct_t* s);              // Passing my_struct_t*

奇怪的是,如果我保留 typedef,但使用原始声明 my_struct,它是 also compiles

typedef struct my_struct my_struct_t;
int func(struct my_struct* s);        // Passing struct my_struct*

其他人注意到了吗?这种行为是副作用吗?

【问题讨论】:

  • typedef 也充当前向声明,它将类型名称带入范围。
  • @DanielFischer 是的,我注意到了 :) 但我在标准中找不到任何说明。我错过了什么吗?
  • 不需要前向声明来创建指向结构的指针。这只是一个约定。我错了吗?
  • 加桑你错了。不声明名称就不能使用指向结构的指针。
  • @Ghasan 可以,但不能在函数参数列表中。见link

标签: c typedef forward-declaration


【解决方案1】:

在第 6.2.1 节第 7 段中:

结构、联合和枚举标记的范围紧随其出现之后开始 声明标签的类型说明符中的标签。每个枚举常量的范围 在其定义的枚举数出现在枚举数列表中之后开始。任何 其他标识符的范围在其声明符完成后开始。

在 6.7.2.3 中,第 8 段:

如果表单的类型说明符 结构或联合标识符 除了作为上述形式之一的一部分发生,并且没有其他声明 标识符作为标签是可见的,然后它声明一个不完整的结构或联合类型,并且 将标识符声明为该类型的标记。

typedef 因此声明了一个不完整的结构类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多