14

2 つの文字列を比較する基本的なプログラムがあります。

#include <string>
#include <iostream>

using namespace std;

int main (int argc, char *argv[]) {
  if(strcmp (argv[0],"./test") != 0) {
    cout << "not equal" << endl;
  } else {
    cout << "equal" << endl;
  }
  return 0;
}

gcc でコンパイルされますが、 clang ではコンパイルされません:

 > clang -o test test_clang.cpp 
test_clang.cpp:7:6: error: use of undeclared identifier 'strcmp'
  if(strcmp (argv[0],"./test") != 0) {
     ^
1 error generated.

なぜ clang でコンパイルしないのですか?

編集:私が質問を投稿するのをためらうまで、人々はスタックオーバーフローに厳しくなっています。上記の質問には簡単な答えがありますが、質問に反対票を投じるのは普通ですか (最初の 1 分間に 2 回!)。

4

4 に答える 4

18

使用する

#include <string.h>

また

#include <cstring>

それ以外の

#include <string>

文字列ヘッダーは、C++ の std::string 用です。string.hは、C のゼロで終了する char* 文字列用です。cstringは string.h に似ていますが、C++ 用です。

gcc で動作した理由は、おそらく警告/エラー レベルの設定が異なるためです。ヘッダーを #include し、strcmp の宣言なしでコードをコンパイルすることは可能です。コンパイラは型チェックを行うことができませんが、シンボルはリンカーによって解決されます。

strcmp の使用を完全に避けて、次のように書くこともできます。

#include <string>
#include <iostream>

int main (int argc, char *argv[]) {
  std::string command = argv[0];

  if( command != "./test" ) {
    std::cout << "not equal" << endl;
  } else {
    std::cout << "equal" << endl;
  }
  return 0;
}

比較の一方に std::string を使用すると、"./test" 文字列も std::string に変換され、std::string クラスの == 演算子によって比較が行われます。 .

于 2012-06-21T12:16:52.770 に答える
11

正しいヘッダー ファイルをインクルードしていません

#include <cstring>
于 2012-06-21T12:15:42.713 に答える
5

あなたがする必要があります#include <cstring>(またはおそらく#include <string.h>。)

多くのコンパイラには、別の標準ヘッダーを含めると、追加の標準ヘッダーが含まれます。標準ではこれが許可されています。たまたまコンパイラの宣言を持っているヘッダーだけでなく、使用するものの宣言を保証するヘッダーを使用するのはあなたの責任です。

于 2012-06-21T12:16:44.713 に答える
3

を含める必要があります<cstring><string>C++ 文字列のヘッダーです。

于 2012-06-21T12:15:56.433 に答える