使用不完整的返回类型调用 ''

分享于2022年09月08日 c struct types 问答
【问题标题】:Calling '' with incomplete return type ''使用不完整的返回类型调用 ''
【发布时间】:2022-08-02 00:51:55
【问题描述】:

尽管我进行了所有验证,但我仍然无法弄清楚我的程序的前 10 行有什么问题......

typedef struct Case_PN Case_PN;

struct Case_PN {
    unsigned entier;
    unsigned flottant;
    union {
        int i;
        double f;
    } u;
};

Case_PN case_pn_init (unsigned type, int val1 , double val2){
    Case_PN c = {0};
    if (type==0){
        c.entier =1; c.flottant = 0; c.u.i =val1;
    }
    else {
        c.entier =0; c.flottant =1; c.u.f = val2;
    }
    return c;
}

稍微解释一下, Case_PN 只是一个联合类型,在 entier ==1 时为 int,在其他情况下为浮点数。 case_pn_init 初始化这样一个结构。 但问题是在编译期间:

int main(int argc, const char * argv[]) {
    case_pn_init(0,1,(8.0));
  
    return 0;
}

带有精彩的错误消息:

使用不完整的返回类型“Case_PN”(又名“struct Case_PN”)调用“case_pn_init”

我该如何修复它? 先感谢您 :)

  • struct Case_PN Case_PN 不一样。
  • 我在编辑后的代码中看到的唯一错误是结构定义后的双 ;; 。删除一个后,它是 compiles fine
  • @TedLyngmo 它仍然无法在 Xcode 上运行,这是我的问题:看起来确实是正确的
  • 如果您的代码看起来像我链接的那个,那么您的编译器可能已损坏。我已经用 four different compilers 测试过了

【解决方案1】:

在函数声明中

Case_PN case_pn_init (unsigned type, int val1 , double val2){

使用了未定义的类型 Case_PN

看来你的意思

struct Case_PN case_pn_init (unsigned type, int val1 , double val2){
    struct Case_PN c = {0};
    //...

即使您使用了 typedef,例如

typedef struct Case_PN Case_PN;

Case_PN case_pn_init (unsigned type, int val1 , double val2){

那么在任何情况下,结构定义都应该在函数定义之前。

似乎调用函数的带有 main 的翻译单元看不到结构定义。

【讨论】:

  • 实际上我之前声明了 typedef struct Case_PN Case_PN 所以......这应该不是问题......
  • @Romanion 然后提供相应的代码。
  • 抱歉,我编辑了我的帖子......你也想要原型吗?
  • @Romanion 查看我更新的答案。
  • 你是什​​么意思 ?我在 case_pn _init ...