web-dev-qa-db-fra.com

Utilisation d'une structure dans un fichier d'en-tête erreur "type inconnu"

J'utilise Kdevelop dans Kubuntu. J'ai déclaré une structure dans mon fichier datasetup.h:

#ifndef A_H
#define A_H

struct georeg_val {

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

#endif

Maintenant, quand je l'utilise dans mon fichier main.c

int main()
{
    georeg_val gval;

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

}

J'obtiens l'erreur suivante:

georeg_chain.c: 7: 3: erreur: nom de type inconnu 'georeg_val'

(C'est dans le georeg_val gval; ligne)

J'apprécierais si quelqu'un pouvait m'aider à résoudre cette erreur.

15
dead_jake

En C on a deux possibilités pour déclarer la structure:

struct STRUCT_NAME {} ;

ou

typedef struct {} STRUCT_ALIAS;

Si vous utilisez la première méthode (donnez un nom à struct) - vous devez définir la variable en la marquant explicitement comme a struct:

struct STRUCT_NAME myStruct;

Cependant, si vous utilisez la deuxième méthode (donnez un alias à struct), vous pouvez omettre l'identificateur struct - le compilateur peut déduire le type de variable étant donné que c'est seulement alias:

STRUCT_ALIAS myStruct;

Points bonus: vous pouvez déclarer une structure avec son nom et son alias:

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

Ensuite, dans la définition de variable, vous pouvez utiliser la première ou la deuxième méthode. Pourquoi les deux mondes sont bons? L'alias de structure vous permet de raccourcir les définitions des variables de structure - ce qui est parfois une bonne chose. Mais le nom de la structure vous permet de créer forward declarations. Quel est l'outil indispensable dans certains cas - considérez que vous avez des références circulaires entre les structures:

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

Outre que cette architecture peut être imparfaite - cette définition circulaire sera compilée lorsque les structures sont déclarées de la première manière (avec des noms) ET les pointeurs de structure sont référencés explicitement en les marquant comme struct.

27

Si vous devez définir un nouveau type, vous devez écrire:

typedef struct {

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

Ensuite, vous pouvez utiliser georeg_val comme nouveau type.

8
Gabriel

Définition d'un type de structure (dans cet exemple, une structure d'arbre de recherche binaire):

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

typedef struct tree treeNode;

Déclarer une fonction, par exemple:

treeNode *insertElement(treeNode *treeA, int number);
4
Lucas Ferreira