我正在尝试通过将命令拆分为单独的文件来组织我的项目,以便于维护。我遇到的问题是尝试迭代在编译时定义的命令数组。我创建了一个简化的示例来重现我遇到的错误。
.
├── 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})
命令/CMakeLists.txt
SET(SRCS ${SRCS} command.c help_command.c)
命令/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
命令/command.c
#include "command.h"
#include "help_command.h"
struct command command_table[] = {
{"help", help_init, help_exec},
};
命令/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
命令/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;
}
如果你运行这个
mkdir build && cd build && cmake .. && make
发生以下错误
path/to/main.c:6:40: error: invalid application of 'sizeof' to incomplete type 'struct command[]'
command_table
那么,如果我什至无法确定数组中的命令数量,我该如何迭代呢?
我意识到还有其他帖子存在同样的错误,但我现在花了一段时间试图弄清楚为什么这不起作用并继续失败: