这是我的.h文件
#ifndef _test_h_
#define _test_h_
void new_cmd(void);
void open_cmd(void);
void close_cmd(void);
void close_all_cmd(void);
void save_cmd(void);
void save_as_cmd(void);
void save_all_cmd(void);
void print_cmd(void);
void exit_cmd(void);
void call(char *cmd_name);
struct {
char *cmd_name;
void (*cmd_pointer)(void);
} file_cmd[] =
{
{"new", new_cmd},
{"open", open_cmd},
{"close", close_cmd},
{"save", save_cmd},
{"save as", save_as_cmd},
{"save all", save_all_cmd},
{"print", print_cmd},
{"exit", exit_cmd}};
#endif
这是我的功能文件
void call(char *cmd_name){
int i;
scanf("Enter command: %c\n",cmd_name);
for(i = 0; i < sizeof(file_cmd); i++){
if(strcmp(cmd_name, file_cmd[i].cmd_name) == 0){
file_cmd[i].cmd_pointer();
}
}
我刚刚删除了所有file_cmd函数,因为对其他人来说似乎是
这是我的主文件
#include <stdio.h>
#include <string.h>
#include "test.h"
int main(void){
char cmd;
call(cmd);
return 0;
}
我想知道的是我的函数void调用已正确编写。
当我尝试编译时,它说
我很困惑如何解决它。
请帮助
谢谢。
答案 0 :(得分:2)
您有两个确实非常不同的错误,您确实应该在两个不同的问题中提出,但是我会很乐意回答这两个问题。
在main
函数中,您有一个名为cmd
的变量。它的类型为char
。您将其传递给call
函数,该函数需要一个char *
类型的参数(即,以空字符结尾的字符串)。
要解决此问题,您首先需要确保cmd
是正确的类型(即char *
而不是普通的char
)。其次,您需要确保此指针实际上指向有效的以空值结尾的字节字符串。
换句话说,是这样的:
char *cmd = "open";
call(cmd);
C实际上只关心translation units。翻译单元是一个包含所有头文件的单一源文件。
这里的问题是只能在单个翻译单元中定义变量。而且,由于您在多个源文件中包含的头文件中定义了变量file_cmd
,因此将在从这两个源文件创建的两个转换单元中对其进行定义。
这里的解决方案是仅在头文件中声明变量,并在单个源文件中定义。
例如,在头文件中执行类似的操作
struct command_struct
{
char *cmd_name;
void (*cmd_pointer)(void);
};
extern struct command_struct file_cmd[];
然后在一个源文件中(例如您的“功能文件”)
struct command_struct file_cmd[] = {
// Your initialization...
};
您的代码还存在其他问题,其中一些会导致undefined behavior。
例如,sizeof
运算符返回的大小以字节为单位,而不是数组中元素的数量。要获得数组中元素的数量,您需要将整个数组的字节大小除以单个元素的字节大小。例如sizeof file_cmd / file_cmd[0]
。
请注意,该除法仅适用于 real 数组,不适用于指针,并且该数组很容易衰减到指针(指向其第一个元素)。