尝试使用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;
}
如果我按原样离开,我会收到标题中所述的警告。如果我删除了argv上的一个星号,我收到一个关于将“char *”转换为“char **”的错误。并删除额外的功能(即将所有功能全部放在主要部分,如此):
int main(int argc, char** argv) {
if ( argv != NULL ) {
while (true) {
cout << argv[1] << endl;
}
} else {
while (true) {
cout << "y" << endl;
}
}
return 0;
}
对警告没有任何区别。
先谢谢...
答案 0 :(得分:4)
您可以撰写char **argv
或char *argv[]
,但不能同时撰写双星和双括号。
ISO / IEC 14882:2011§3.6.1主要功能
实现不应预定义
main
函数。此功能不应过载。它应该 具有类型int
的返回类型,但其类型是实现定义的。所有实施都应该 允许以下两个主要定义:int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
在后一种形式中,
argc
应该是从环境传递给程序的参数数量 程序运行的程序。如果argc
非零,则argv[0]
中应提供这些参数 通过argv[argc-1]
作为指向空终止多字节字符串(NTMBS)(17.5.2.1.4.2)和argv [0]的初始字符的指针应该是指向表示ntmbs的初始字符的指针 用于调用程序的名称或""
。 argc的值应为非负值。argv[argc]
的值 应为0.
答案 1 :(得分:1)
main的第二个参数是一个C-Strings数组,包含您传入的选项,因此它应该是char*argv[]
或char **
。
答案 2 :(得分:1)
从argv
上的main
删除括号:
int main(int argc, char** argv) {
来自cmd
上的yes
的AND
void yes (char* cmd) {
答案 3 :(得分:0)
似乎第一个答案钉了它。简而言之,它不是删除“是”函数(以及随后将其代码合并到main中)或删除其中一个星号(即“char * argv”而不是“char ** argv”) ,但两者的组合删除了警告(只是删除其中一个星号仍然存在功能导致转换错误)。
再次感谢!