gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:34:59 25 4
gpt4 key购买 nike

这是我的 .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. main函数中,有一个名为cmd的变量。它的类型是char。您将其传递给 call 函数,该函数需要一个 char * 类型的参数(即以 null 结尾的字符串)。

    要解决此问题,您首先需要确保 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]

请注意,除法仅适用于真实数组,而不是指针,并且数组很容易衰减为指针(指向其第一个元素)。

关于c - 多重定义并确保函数正确编写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53128281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com