【问题标题】:Using a struct in a header file "unknown type" error在头文件“未知类型”错误中使用结构
【发布时间】:2012-04-30 14:53:19
【问题描述】:

我在 Kubuntu 中使用 Kdevelop。 我在 datasetup.h 文件中声明了一个结构:

#ifndef A_H
#define A_H

struct georeg_val {

    int p;
    double h;
    double hfov;
    double vfov;
};

#endif

现在当我在 main.c 文件中使用它时

int main()
{
    georeg_val gval;

    read_data(gval); //this is in a .cpp file

}

我收到以下错误:

georeg_chain.c:7:3: 错误:未知类型名称'georeg_val'

(这是在georeg_val gval; 行)

如果有人能帮我解决这个错误,我将不胜感激。

【问题讨论】:

  • 你在这里混合 C 和 C++ 吗?
  • 确保您正在导入标头:import "datasetup.h"

标签: c struct header-files kdevelop


【解决方案1】:

在 C 中,声明结构有两种可能性:

struct STRUCT_NAME {} ;

typedef struct {} STRUCT_ALIAS;

如果您使用第一种方法(给结构命名) - 您必须通过将变量显式标记为 a struct 来定义变量:

struct STRUCT_NAME myStruct;

但是,如果您使用第二种方法(给 struct 一个别名),那么您可以省略 struct 标识符 - 编译器可以推断变量的类型,只要它是 alias

STRUCT_ALIAS myStruct;

奖励积分: 您可以使用名称和别名声明结构:

typedef struct STRUCT_TAG {} STRUCT_TAG;
// here STRUCT_NAME == STRUCT_ALIAS

然后在变量定义中你可以使用第一种或第二种方法。为什么两个世界都好?结构别名使您可以使结构变量定义更短——这有时是一件好事。但是 struct name 让你创建forward declarations。在某些情况下,这是必不可少的工具 - 考虑到结构之间存在循环引用:

struct A {
  struct B * b;
}
struct B {
  struct A * a;
}

此外,这种架构可能存在缺陷 - 当以第一种方式(使用名称)声明结构并且通过将结构指针标记为 struct 来显式引用结构指针时,此循环定义将编译。

【讨论】:

    【解决方案2】:

    如果你必须定义一个新的类型,你必须写:

    typedef struct {
    
        int p;
        double h;
        double hfov;
        double vfov;
    } georeg_val ;
    

    那么你就可以使用 georeg_val 作为一个新的类型了。

    【讨论】:

    • 或者在main中切换到struct georeg_val gval;
    • @dead_jake 还有#include main.c 中的头文件(如果你还没有这样做的话)
    【解决方案3】:

    定义结构类型(在本例中为二叉搜索树结构):

    struct tree { 
      int info;
      struct tree *left;
      struct tree *right;
    } 
    
    typedef struct tree treeNode;
    

    声明一个函数,例如:

    treeNode *insertElement(treeNode *treeA, int number);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      相关资源
      最近更新 更多