2012-04-08 1 views
0

Pour contrôlant les membres struct et programmeurs de force d'utiliser les fonctions de lecture/définition, je veux écrire du code comme ci-dessous motif:Comment définir et utiliser une structure sans définition de structure complète dans l'en-tête?

/* Header file: point.h */ 
... 
/* define a struct without full struct definition. */ 
struct point; 

/* getter/setter functions. */ 
int point_get_x(const struct point* pt); 
void point_set_x(struct point* pt, int x); 
... 

//-------------------------------------------- 

/* Source file: point.c */ 
struct point 
{ 
    int x, y; 
}; 

int point_get_x(const struct point* pt) {return pt->x; } 

void point_set_x(struct point* pt, int x) {pt->x = x;} 

//-------------------------------------------- 

/* Any source file: eg. main.c */ 

#include "point.h" 
int main() 
{ 
    struct point pt; 

    // Good: cannot access struct members directly. 
    // He/She should use getter/setter functions. 
    //pt.x = 0; 

    point_set_x(&pt, 0); 
} 

Mais ce code ne compile pas avec MSVC++ 2010.

Quels changements devrais-je faire pour compiler?

Remarque: j'utilise la norme ANSI-C (C89), non C99 ou C++.

Répondre

4

Créez une fonction make_point dans point.c pour créer le point; main.c ne sait pas quelle est la taille de la structure.

également

typedef struct point point; 

soutiendra l'utilisation point plutôt que struct point dans les déclarations.

3
point pt; 

Le nom de ce type est struct point. Vous devez utiliser le tout à chaque fois, ou vous avez besoin de typedef. *

I.e. vous devez écrire

struct point pt; 

main.


Vous pensez probablement FILE* et des choses comme à partir de la bibliothèque standard et que vous voulez reproduire ce comportement. Pour ce faire, utilisez

struct s_point 
typedef struct s_point point; 

dans l'en-tête. (Il existe des façons plus courtes d'écrire cela, mais je veux éviter toute confusion.) Cela déclare un type nommé struct s_point et lui attribue un alias point.


(*) Notez que cela diffère de C++, où struct point déclare un type appelé point qui est un struct.

+0

Vous avez raison, je l'ai oublié :). Mais une autre erreur apparaît: 'erreur C2079: 'pt' utilise struct 'point' non défini –

+0

Voir la réponse de Doug pour cela:' main' ne sait pas quelle est la taille d'un 'point', donc vous voulez faire un' point * 'il ya une allocation du code de la bibliothèque. – dmckee

Questions connexes