I am trying to organize my project by splitting commands up into separate files for easier maintenance. The issue I am having is trying to iterate over the array of commands defined at compile time. I have created a dumbed down example that reproduces the error I am getting.
.
├── 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
", sizeof(command_table) / sizeof(command_table[0]));
return 0;
}
If you run this
mkdir build && cd build && cmake .. && make
the following error occurs
path/to/main.c:6:40: error: invalid application of 'sizeof' to incomplete type 'struct command[]'
So, how do I iterate over command_table
if I can't even determine the number of commands in the array?
I realize there are other posts out there with this same error, but I've spent a while now trying to figure out why this doesn't work and continue to fail:
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…