警告:第二个参数为‘;内部主(内部,字符***)和#x2019;应该是‘;字符**’;[-Wmain](GNU C&x2B;和&x2B;编译器;Ubuntu 12.10) 使用C++作为一个小实验(这是Ubuntu 12.10),克隆了“是”命令,这里有一个小问题: #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> using namespace std; void yes (char* cmd[]) { if ( cmd != NULL ) { while (true) { cout << cmd[1] << endl; } } else { while (true) { cout << "y" << endl; } } } int main(int argc, char** argv[]) { yes(argv[1]); return 0; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效是(char*cmd[]){ 如果(cmd!=NULL){ while(true){ cout

警告:第二个参数为‘;内部主(内部,字符***)和#x2019;应该是‘;字符**’;[-Wmain](GNU C&x2B;和&x2B;编译器;Ubuntu 12.10) 使用C++作为一个小实验(这是Ubuntu 12.10),克隆了“是”命令,这里有一个小问题: #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <cstdlib> using namespace std; void yes (char* cmd[]) { if ( cmd != NULL ) { while (true) { cout << cmd[1] << endl; } } else { while (true) { cout << "y" << endl; } } } int main(int argc, char** argv[]) { yes(argv[1]); return 0; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; 无效是(char*cmd[]){ 如果(cmd!=NULL){ while(true){ cout,c++,gcc,ubuntu-12.10,C++,Gcc,Ubuntu 12.10,main的第二个参数是一个C字符串数组,包含您传入的选项,因此它应该是char*argv[]或char** 看看main的第二个参数是一个C字符串数组,包含您传入的选项,因此它应该是char*argv[]或char** 看看你可以写char**argv或char*argv[],但不能同时写双星和双括号 ISO/IEC 14882:2011§3.6.1主要功能 实现不应预定义main函数。此函数不应重载。它应 具有类型为int的返回类型,但其类型是实现定义的。所有实现都应 允许以下两种定义的mai

main的第二个参数是一个C字符串数组,包含您传入的选项,因此它应该是
char*argv[]
char**


看看

main的第二个参数是一个C字符串数组,包含您传入的选项,因此它应该是
char*argv[]
char**


看看你可以写
char**argv
char*argv[]
,但不能同时写双星和双括号

ISO/IEC 14882:2011§3.6.1主要功能 实现不应预定义
main
函数。此函数不应重载。它应 具有类型为
int
的返回类型,但其类型是实现定义的。所有实现都应 允许以下两种定义的main:

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }
在后一种形式中,
argc
应为从环境传递给程序的参数数量 如果
argc
为非零,则这些参数应在
argv[0]
通过
argv[argc-1]
作为指向以空结尾的多字节字符串(ntmbs)(17.5.2.1.4.2)的初始字符的指针,argv[0]应是指向表示 用于调用程序的名称或
。argc的值应为非负。
argv[argc]
应为0


您可以编写
char**argv
char*argv[]
,但不能同时使用双星和双括号

ISO/IEC 14882:2011§3.6.1主要功能 实现不应预定义
main
函数。此函数不应重载。它应 具有类型为
int
的返回类型,但其类型是实现定义的。所有实现都应 允许以下两种定义的main:

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }
在后一种形式中,
argc
应为从环境传递给程序的参数数量 如果
argc
为非零,则这些参数应在
argv[0]
通过
argv[argc-1]
作为指向以空结尾的多字节字符串(ntmbs)(17.5.2.1.4.2)的初始字符的指针,argv[0]应是指向表示 用于调用程序的名称或
。argc的值应为非负。
argv[argc]
应为0


main
上的
argv
上卸下支架:

int main(int argc, char** argv) {
cmd上的
yes

void yes (char* cmd) {

main
上的
argv
上卸下支架:

int main(int argc, char** argv) {
cmd上的
yes

void yes (char* cmd) {

似乎第一个答案就解决了这个问题。长话短说,并不是删除了“yes”函数(随后将其代码合并到main中)或删除了一个星号(即“char*argv”而不是“char**argv”),而是两者的结合消除了警告(只需在函数仍然存在的情况下删除其中一个星号,就会导致转换错误)


再次感谢!

似乎是第一个答案解决了问题。长话短说,不是删除了“yes”函数(随后将其代码合并到main中)或删除了其中一个星号(即“char*argv”而不是“char**argv”),而是两者的组合消除了警告(只需在函数仍然存在的情况下删除其中一个星号,就会导致转换错误)

再次感谢!

问题是什么?
main()
argv
上使用三重间接寻址并不是正确的,但是任何C/C++书籍或网站都会告诉您。您是否希望解决此问题?问题可能重复?
main()
argv
上使用三重间接寻址并不是正确的,但是任何C/C++书籍或网站都会告诉您。您是否希望修复此问题?可能是重复的