Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多定义并确保正确编写函数_C - Fatal编程技术网

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

C 多定义并确保正确编写函数,c,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

这是我的.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();
        }
}
struct command_struct file_cmd[] = {
    // Your initialization...
};
void调用(char*cmd\u名称){
int i;
scanf(“输入命令:%c\n”,cmd\u名称);
对于(i=0;i
我刚刚删除了所有file_cmd函数,因为它似乎适用于其他人

这是我的主要文件

#include <stdio.h>
#include <string.h>
#include "test.h"

int main(void){

char cmd;

call(cmd);

return 0;
}
#包括
#包括
#包括“test.h”
内部主(空){
char-cmd;
呼叫(cmd);
返回0;
}
我更想知道的是我的函数void调用写得是否正确

当我试图编译时,它说

  • 应为“char*”,但参数的类型为“char”
  • “file_cmd”的多个定义
  • 首先在这里定义
  • 我真不知道怎么修它

    请帮忙

    谢谢。

    您有两个非常不同的错误,您真的应该在两个不同的问题中询问,但无论如何,我都会很好地回答这两个问题

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

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

    换句话说,类似这样的事情:

    char *cmd = "open";
    call(cmd);
    
  • 翻译单元是一个包含所有头文件的源文件

    这里的问题是,变量只能在单个翻译单元中定义。由于在多个源文件中包含的头文件中定义变量
    file_cmd
    ,因此它将在从这两个源文件创建的两个翻译单元中定义

    这里的解决方案是只在头文件中声明变量,并在单个源文件中定义它

    例如,在头文件中执行类似的操作

    struct command_struct
    {
        char *cmd_name;
        void (*cmd_pointer)(void);
    };
    
    extern struct command_struct file_cmd[];
    
    然后在一个源文件中(如“函数文件”)


  • 您的代码还存在其他问题,其中一些问题会导致错误

    例如,
    sizeof
    运算符返回字节大小,而不是数组中的元素数。要获取数组中的元素数,需要将整个数组的字节大小除以单个元素的字节大小。例如,
    sizeof file\u cmd/file\u cmd[0]

    请注意,除法只适用于实数组,而不适用于指针,而且数组很容易衰减为指针(指向它们的第一个元素)