Использование структуры в файле заголовка "неизвестный тип"

Я использую Kdevelop в Kubuntu. Я объявила структуру в файле 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;)

Я был бы признателен, если бы кто-нибудь мог помочь мне разрешить эту ошибку.

Ответ 1

В C есть две возможности объявить структуру:

struct STRUCT_NAME {} ;

или

typedef struct {} STRUCT_ALIAS;

Если вы используете первый метод (укажите struct name) - вы должны определить переменную, указав ее явно a struct:

struct STRUCT_NAME myStruct;

Однако, если вы используете второй метод (укажите struct a alias), вы можете опустить struct identifier - компилятор может вывести тип переменной, если только он alias:

STRUCT_ALIAS myStruct;

Бонусные баллы: Вы можете объявить структуру с именем и псевдонимом:

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

Затем в определении переменной вы можете использовать первый или второй метод. Почему оба двух мира хороши? Атрибут Struct позволяет вам сделать определения переменных структуры короче - что иногда бывает хорошо. Но имя структуры позволяет вам сделать 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 как новый тип.

Ответ 3

Определение типа структуры (в этом примере - двоичная структура дерева поиска):

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

typedef struct tree treeNode;

Объявление функции, например:

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