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 のアスタリスクの 1 つを削除すると、「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

4 に答える 4

6

二重スターと二重ブラケットの両方を記述できますが、両方char **argvを記述することはできません。char *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

main の 2 番目のパラメーターは、渡すオプションを含む C-String の配列であるため、char*argv[]またはである必要がありますchar **

liveworkspace のスニペットを見てみましょう

于 2013-01-22T02:37:54.097 に答える
1

からブラケットを削除しargvますmain

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

そしてこれからcmd_yes

void yes (char* cmd) {
于 2013-01-22T02:38:57.487 に答える
0

最初の答えがそれを釘付けにしたようです。簡単に言うと、「yes」関数の削除 (およびその後のそのコードの main へのマージ) や、アスタリスクの 1 つの削除 (つまり、「char** argv」ではなく「char* argv」) ではありませんでした。 、しかし両方を組み合わせて警告を削除しました(関数がまだ配置されている状態でアスタリスクの1つを単に削除すると、変換エラーが発生しました)。

再度、感謝します!

于 2013-01-22T03:09:49.700 に答える