application non valide de ‘sizeof’ au type incomplet ‘struct array ‘

J’essaie d’organiser mon projet en divisant les commandes en fichiers séparés pour faciliter la maintenance. Le problème que j’ai est d’essayer d’itérer sur le tableau de commandes définies au moment de la compilation. J’ai créé un exemple simplifié qui reproduit l’erreur que je reçois.

. ├── CMakeLists.txt ├── commands │  ├── CMakeLists.txt │  ├── command.c │  ├── command.h │  ├── help_command.c │  └── help_command.h └── main.c 

./CMakeLists.txt

 PROJECT(COMMAND_EXAMPLE) SET(SRCS main.c) ADD_SUBDIRECTORY(commands) ADD_EXECUTABLE(test ${SRCS}) 

commandes / CMakeLists.txt

 SET(SRCS ${SRCS} command.c help_command.c) 

commandes / command.h

 #ifndef COMMAND_H #define COMMAND_H struct command { char* name; int (*init)(int argc, char** argv); int (*exec)(void); }; extern struct command command_table[]; #endif 

commandes / commande.c

 #include "command.h" #include "help_command.h" struct command command_table[] = { {"help", help_init, help_exec}, }; 

commandes / help_command.h

 #ifndef HELP_COMMAND_H #define HELP_COMMAND_H int help_command_init(int argc, char** argv); int help_command_exec(void); #endif 

commandes / help_command.c

 #include "help_command.h" int help_command_init(int argc, char** argv) { return 0; } int help_command_exec(void) { return 0; } 

./principal c

 #include  #include "commands/command.h" int main(int argc, char** argv) { printf("num of commands: %d\n", sizeof(command_table) / sizeof(command_table[0])); return 0; } 

Si vous courez ce

 mkdir build && cd build && cmake .. && make 

l’erreur suivante se produit

 path/to/main.c:6:40: error: invalid application of 'sizeof' to incomplete type 'struct command[]' 

Alors, comment puis-je itérer sur commande_table si je ne peux même pas déterminer le nombre de commandes dans le tableau?

Je me rends compte qu’il existe d’autres publications avec cette même erreur, mais j’ai passé un certain temps à essayer de comprendre pourquoi cela ne fonctionne pas et continue d’échouer:

  • application-invalide-de-taille-à-type-incomplet-avec-une-structure
  • application-invalide-of-sizeof-to-incomplet-type-int-when-access-intege

Pour que sizeof(command_table) fonctionne, il doit voir ceci:

 static struct command command_table[] = { {"help", help_init, help_exec}, }; 

Mais il ne voit que ceci:

 extern struct command command_table[]; 

Voir cette sizeof() ne peut jamais déterminer le nombre d’éléments réellement présents.

Au fait, il y a un autre problème. static rend le tableau invisible dans tous les autres modules. Vous devez le supprimer ou le contourner.

Vos options (après la suppression de l’ static ) sont les suivantes:

  1. coder en dur le nombre d’éléments, p. ex.

    extern struct command command_table[3];

  2. définir une variable supplémentaire pour contenir le nombre d’éléments:

commandes / commande.c

 #include "command.h" #include "help_command.h" struct command command_table[] = { {"help", help_init, help_exec}, }; size_t command_count = sizeof(command_table)/sizeof(command_table[0]); 

commandes / command.h

 ... extern struct command command_table[]; extern size_t command_count; ... 

Et ensuite, vous utilisez simplement command_count .

Expliquez le nombre d’éléments de votre tableau dans commands/command.h :

 extern struct command command_table[3];