I am trying to organize my project, breaking commands into separate files for simplification of service. The problem I am facing is trying to iterate over an array of commands defined at compile time. I created a heady example that reproduces the error I get.
. βββ 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)
Commands /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
Commands /command.c
#include "command.h" #include "help_command.h" struct command command_table[] = { {"help", help_init, help_exec}, };
Commands / 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
Commands / 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; }
If you run this
mkdir build && cd build && cmake .. && make
following error occurs
path/to/main.c:6:40: error: invalid application of 'sizeof' to incomplete type 'struct command[]'
So, how can I command_table over command_table if I can't even determine the number of commands in the array?
I understand that there are other posts with the same error, but I spent some time trying to understand why this is not working and continues to fail: