1

尝试使用 C++ 克隆“yes”命令作为一个小实验(这是在 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**”的错误。并删除额外的功能(即把它全部放在 main 中,像这样):

int main(int argc, char** argv) {
  if ( argv != NULL ) {
    while (true) {
      cout << argv[1] << endl;
    }
  } else {
    while (true) {
      cout << "y" << endl;
    }
  }
  return 0;
}

警告没有区别。

先谢谢了...

4

4 回答 4

6

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

ISO/IEC 14882:2011 §3.6.1 主要功能

实现不应预定义main功能。该功能不得重载。它的返回类型应该是 type int,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

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

int main(int argc, char* argv[]) { /* ... */ }

后一种形式argc是从程序运行的环境传递给程序的参数数量。如果argc不为零,则这些参数应作为指向以空结尾的多字节字符串 (NTMBS) (17.5.2.1.4.2) 的初始字符argv[0]argv[argc-1]指针提供,并且 argv[0] 应是指向表示的 ntmbs 的初始字符的指针用于调用程序的名称或"". argc 的值应为非负数。的值argv[argc] 应为 0。

于 2013-01-22T02:38:06.807 回答
1

argv从on删除括号main

int main(int argc, char** argv) {

并且cmd_yes

void yes (char* cmd) {
于 2013-01-22T02:38:57.487 回答
1

main 的第二个参数是一个 C-String 数组,包含你传入的选项,所以它应该是char*argv[]or char **

看看liveworkspace 片段

于 2013-01-22T02:37:54.097 回答
0

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

再次感谢!

于 2013-01-22T03:09:49.700 回答