【问题标题】:How to correctly forward declare a typedef'd struct如何正确转发声明类型定义的结构
【发布时间】:2014-07-28 14:55:48
【问题描述】:

我想要完成的事情:我想在 typedef 的结构内使用 typedef 的函数指针,其中函数指针将结构指针作为参数(即类似于“对象方法”的东西,它需要一个 self - 对“对象”的引用)。

我有这个 C 代码(经过简化,希望不要过于简化):

typedef struct MYSTRUCT myStruct;

typedef void (*getSomething)(myStruct*);

typedef struct MYSTRUCT {
    getSomething get_something;
};

void get_property() {
    myStruct *structure = NULL;
}

所以我认为我正在做的是:前向声明结构,在函数指针 typedef 中使用该声明,然后使用 typedef 的函数指针声明实际结构。

这段代码在 linux 上用 intel 编译器编译(并且似乎做了预期的事情)但是 Visual 编译器抛出一个错误:

error C2275: 'myStruct' : 非法将此类型用作表达式 见 myStruct 的声明

有没有办法让 VC 接受我的预期构造?

【问题讨论】:

  • visual-c++ 标签真的合适吗?
  • 我添加它是因为Visual编译器抛出错误并且在标签C的解释中提到了。
  • C 但只有visual-c++标签存在,没有visual-c标签。如果它存在,我会使用visual-c。

标签: c visual-c++ struct typedef forward-declaration


【解决方案1】:
typedef struct MYSTRUCT {
    getSomething get_something;
};

应该是

struct MYSTRUCT {
    getSomething get_something;
};

【讨论】:

  • 感谢您指出这一点 - 已修复。 (虽然这不是错误的原因,而是我的愚蠢)。
【解决方案2】:
struct MYSTRUCT;                  // Forward declare the struct
typedef struct MYSTRUCT myStruct; // define the typedef;

typedef void (*getSomething)(myStruct*);   // use the typedef;

struct MYSTRUCT {                 // define the struct
    getSomething get_something;
};

void get_property() {             // use the typedef again.
    myStruct *structure = NULL;
}

// Warning: I didn't actually compile that, and I'm going from memory.

【讨论】:

  • 实际上,我已经尝试过了,但它并没有改变任何东西,因为错误的原始原因是不同的。
  • 我对 C99 标准的阅读表明,不需要转发声明 struct MYSTRUCT... typedef struct MYSTRUCT mystruct 足以声明不完整的 struct MYSTRUCT 和一个不完整的 typedef 类型 mystruct。我经常使用这个,所以我真的希望我对标准的理解是正确的!
  • @gmch - 很有可能。我比 C 更像是 C++ 专家,并且对 c89->c99 的更改知之甚少。 (即使使用 C++,我对 C++98 的了解也比 C++11 好)
【解决方案3】:

对不起。我刚刚意识到这不是我的前向声明的问题,而是因为我在实际代码中真正做的是:

void get_property() {
    some = assignment_statement;
    myStruct *structure = NULL;
}

即我不小心把我的变量声明+定义放在了第一个代码语句的下面。所以确实,我过度简化了我的代码片段。对此感到抱歉。

【讨论】:

  • 这是编写您之前测试过的完整示例的原因之一,通过编译和运行(在这种情况下,当然只有前者)并且知道简化的代码可以重现问题。
  • @user1573870 - 将此标记为已回答以关闭循环。 :)
  • 两天前我无法接受自己的答案。 @mafso 是的,你是对的,我很抱歉。
  • @user1573870 已经超过 2 天了。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多