ungültige Anwendung von "sizeof' unvollständiger Typ " struct array[]'
Ich versuche zu organisieren, die mein Projekt durch die Aufteilung der Befehle in separate Dateien für eine einfachere Wartung. Die Frage, die ich habe versucht, zu iterieren über das array von Befehlen definiert zur compile-Zeit. Habe ich einen verdummt Beispiel, dass den Fehler reproduziert, die ich immer bin.
.
├── 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})
commands/CMakeLists.txt
SET(SRCS ${SRCS} command.c help_command.c)
Befehle/Befehl.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
Befehle/Befehl.c
#include "command.h"
#include "help_command.h"
struct command command_table[] = {
{"help", help_init, help_exec},
};
Befehle/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
Befehle/help_command.c
#include "help_command.h"
int help_command_init(int argc, char** argv)
{
return 0;
}
int help_command_exec(void)
{
return 0;
}
./main.c
#include <stdio.h>
#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;
}
Wenn Sie diese
mkdir build && cd build && cmake .. && make
tritt der folgende Fehler auf
path/to/main.c:6:40: error: invalid application of 'sizeof' to incomplete type 'struct command[]'
So, wie ich Durchlaufen command_table
wenn ich kann nicht einmal bestimmen Sie die Anzahl der Befehle, die in das array?
Ich weiß, es gibt andere Beiträge gibt, mit diesen gleichen Fehler, aber ich habe jetzt eine Weile versucht herauszufinden, warum dies nicht funktioniert und auch weiterhin Versagen:
- ungültige Anwendung von "sizeof" auf unvollständigen-Typ-mit-einem-struct
- ungültige Anwendung von "sizeof" auf unvollständigen-Typ-int-wenn-auf-intege
sizeof command
wo seine Größe bekannt ist. Der einzige Ort, wo es ist bekannt, im moment ist command.c
, so fügen Sie eine const size_t num_commands = sizeof command / sizeof command[0];
dort, und habe ein extern
Erklärung, dass in command.h
zu.
InformationsquelleAutor E-rich | 2012-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für Ihre
sizeof(command_table)
zu arbeiten, muss Sie dies sehen:Aber es sieht nur dies:
Sehen, dass
sizeof()
kann nie herausfinden, wie viele Elemente tatsächlich dort.Btw, es gibt ein anderes problem.
static
macht das array unsichtbar in alle anderen Module. Sie haben, um es zu entfernen oder einen workaround.Ihre Optionen (nach dem entfernen
static
):hard-Codierung die Anzahl der Elemente, z.B.
extern struct command command_table[3];
Definition eine zusätzliche variable, um die Anzahl der Elemente:
Befehle/Befehl.c
Befehle/Befehl.h
Dann verwenden Sie einfach
command_count
.Gibt es eine andere Möglichkeit um (z.B. mit Zeigern?) zur Berechnung der Größe des Arrays ohne Zugabe command_count in-Befehl.h und Befehl.c. In anderen Worten, in meinem Fall, ich habe keine Berechtigung zum Bearbeiten Befehl.c und Befehl.h.
Es gibt keine Reflexion/Introspektion in C, so kann man nicht einfach irgendwie die Abfrage der Beschreibung eines Typs oder eines Objekts. Sie muss es wissen. Jedoch, einige nicht-standard-hacks möglich sein kann. E. g. Sie können extrahieren Sie den symbol - /debug-Informationen aus der Objekt-Datei in die Kommandozeile.c kompiliert und dann generieren Sie eine zusätzliche include-Datei die Zählung der array-Elemente. IMO, ist es praktischer, einfach die benötigte Berechtigung.
InformationsquelleAutor Alexey Frunze
Explizit die Anzahl der Elemente von array in
commands/command.h
:InformationsquelleAutor ouah