多重定义并确保函数正确编写

时间:2018-11-03 03:58:30

标签: c

这是我的.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调用已正确编写。

当我尝试编译时,它说

  1. 预期为'char *',但参数的类型为'char'
  2. “ file_cmd”的多个定义
  3. 首先在这里定义。

我很困惑如何解决它。

请帮助

谢谢。

1 个答案:

答案 0 :(得分:2)

您有两个确实非常不同的错误,您确实应该在两个不同的问题中提出,但是我会很乐意回答这两个问题。

  1. main函数中,您有一个名为cmd的变量。它的类型为char。您将其传递给call函数,该函数需要一个char *类型的参数(即,以空字符结尾的字符串)。

    要解决此问题,您首先需要确保cmd是正确的类型(即char *而不是普通的char)。其次,您需要确保此指针实际上指向有效的以空值结尾的字节字符串。

    换句话说,是这样的:

    char *cmd = "open";
    call(cmd);
    
  2. 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 数组,不适用于指针,并且该数组很容易衰减到指针(指向其第一个元素)。

相关问题