C 生成指针数组时函数指针类型不兼容
我正在用C创建一个基本的shell,在使用gcc编译时遇到了一些问题: 这是来自我的IDE的警告: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测试文件发出拉取请求时遇到的
[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中消失并编译。谢谢你的澄清!