为什么返回类型的存在会阻止对参数的前向声明的需要?

时间:2016-05-07 13:06:23

标签: c forward-declaration

考虑包含以下内容的头文件 foo.h

struct wl_display;

struct wl_array * bar(struct wl_display *display);

实施文件 foo.c ,其中包含wl_display的完整定义和bar的实施:

struct wl_display {
    int baz;
};

struct wl_array * bar(struct wl_display *display) {
    // ...
}

如果我从 foo.h 中删除struct wl_display的前向声明,则 gcc 编译器将:

  1. 发出警告,表示参数列表中struct wl_display *display的出现位于块范围内(警告:' struct wl_display'在参数列表中声明警告:它的范围只是这个定义或声明,可能不是你想要的)。
  2. 发出错误:' bar'的冲突类型 bar(struct wl_display * display)
  3. 但是,如果我然后添加一个使用struct wl_display *作为返回类型的函数,那么 foo.h 包含:

    // struct wl_display;
    
    struct wl_display * foo(void);
    
    struct wl_array * bar(struct wl_display *display);
    

    一切都干净利落。

    为什么使用struct wl_display*作为返回类型会消除前向声明的需要?什么是"冲突"导致上面的错误#2,因为参数类型只是一个指针,并且函数签名是相同的?

2 个答案:

答案 0 :(得分:1)

struct wl_display的第一次引用构成了一个声明,虽然不完整。在函数返回类型的情况下,它是顶级声明。但是在一个参数列表中,它不是。相反,当在参数列表中声明时,声明在函数范围内,并且在函数定义之后超出范围。

答案 1 :(得分:1)

文件范围中struct wl_display的任何用法都是该类型的前向声明。因此,如果编译器首先看到它,则参数列表中的用法指的是该类型。如果首先看到列表中的声明,则声明一个仅对列表有效的类型,而不是其他地方。