C 生成指针数组时函数指针类型不兼容

C 生成指针数组时函数指针类型不兼容,c,pointers,gcc,C,Pointers,Gcc,我正在用C创建一个基本的shell,在使用gcc编译时遇到了一些问题: 这是来自我的IDE的警告: [query] incompatible function pointer types initializing 'const void (*)(char **)' with an expression of type 'void (*)(char **)' [-Wincompatible-function-pointer-types] 这是我在尝试使用设置的json测试文件发出拉取请求时遇到的

我正在用C创建一个基本的shell,在使用gcc编译时遇到了一些问题:

这是来自我的IDE的警告:

[query] incompatible function pointer types initializing 'const void (*)(char **)' with an expression of type 'void (*)(char **)' [-Wincompatible-function-pointer-types]
这是我在尝试使用设置的json测试文件发出拉取请求时遇到的错误:

 grsh.c:28:48: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]

   const void (*command_functions[]) (char **) = {&exit_shell, &change_directory, &set_path};
                                                  ^
  grsh.c:28:48: note: (near initialization for 'command_functions[0]')
  grsh.c:28:61: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
   const void (*command_functions[]) (char **) = {&exit_shell, &change_directory, &set_path};
有关的特定代码行:

const void (*command_functions[]) (char **) = {&exit_shell, &cd, &set_path};
我会百分之百地说,我不确定这里到底是什么问题。当运行普通的compile命令时,该程序在Repl.it中编译和运行,但在尝试使用-Werror和-Wall编译时遇到问题

希望得到一些关于如何正确初始化char类型指针数组的反馈

const void (*command_functions[]) (char **) = { /*...*/ };
上面复制的发布代码将
command\u函数
声明为指向返回
const void
函数的指针数组(这是合法的,尽管不常见,请参见示例)

要将
command\u函数
声明为返回
void
函数的常量指针数组,请使用以下命令

void (*const command_functions[]) (char **) = { /*...*/ };
上面复制的发布代码将
command\u函数
声明为指向返回
const void
函数的指针数组(这是合法的,尽管不常见,请参见示例)

要将
command\u函数
声明为返回
void
函数的常量指针数组,请使用以下命令

void (*const command_functions[]) (char **) = { /*...*/ };

exit\u shell
在何处以及如何声明?请回答您的问题以显示代码的更多上下文。最好是正确的。您不需要
来获取函数的地址<代码>..={退出\u shell,更改\u目录,设置\u路径}也同样有效。除非与
sizeof
&
一起使用,否则函数指示符将自动转换为其函数的地址。(由于指示符被转换为地址,
*exit\u shell
获取地址并尝试将其再次用作函数,但该函数会自动转换为地址。因此,您可以编写
****************exit\u shell
,它仍然是地址。例如,您可以将正弦例程调用为
(*************sin)(x)
)在哪里以及如何声明
退出\u shell
?请回答您的问题以显示代码的更多上下文。最好是正确的。您不需要
来获取函数的地址<代码>..={退出\u shell,更改\u目录,设置\u路径}也同样有效。除非与
sizeof
&
一起使用,否则函数指示符将自动转换为其函数的地址。(由于指示符被转换为地址,
*exit\u shell
获取地址并尝试将其再次用作函数,但该函数会自动转换为地址。因此,您可以编写
****************exit\u shell
,它仍然是地址。例如,您可以将正弦例程调用为
(*************sin)(x)
)警告在IDE和编译中消失。谢谢你的澄清!警告在IDE中消失并编译。谢谢你的澄清!