警告:'int main(int,char ***)'的第二个参数应该是'char **'[ - Wmain](GNU C ++编译器; Ubuntu 12.10)

时间:2013-01-22 02:34:04

标签: c++ gcc 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;
}

如果我按原样离开,我会收到标题中所述的警告。如果我删除了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;
}

对警告没有任何区别。

先谢谢...

4 个答案:

答案 0 :(得分:4)

您可以撰写char **argvchar *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 **

查看liveworkspace snippet

答案 2 :(得分:1)

argv上的main删除括号:

int main(int argc, char** argv) {
来自cmd

上的yes

AND

void yes (char* cmd) {

答案 3 :(得分:0)

似乎第一个答案钉了它。简而言之,它不是删除“是”函数(以及随后将其代码合并到main中)或删除其中一个星号(即“char * argv”而不是“char ** argv”) ,但两者的组合删除了警告(只是删除其中一个星号仍然存在功能导致转换错误)。

再次感谢!