为什么clang不认识strcmp函数?

15

我有一个基本程序,用于比较两个字符串:

#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编译会失败?
编辑:人们在stackoverflow上变得非常苛刻,以至于我犹豫是否要发布一个问题。上面的问题有一个简单的答案,但是因为它具有简单但不明显的答案,下降问题(在第一分钟内下降两次!)是否正常?

2
我不知道为什么人们会对此进行负投票。这很明确并且是一个有效的问题。 - aschepler
5
制作最小化示例并在两个编译器上比较结果是一项研究工作。 - aschepler
1
在发布之前,我将第一个示例的代码复制并粘贴到文件中,然后想:“我应该像iostream一样从包含中删除这些'.h'”。我错了,但绝对不是懒惰。此外,我的最小示例可以使用gcc工作,因此我很惊讶。我认为你有点过于草率地得出结论并评判我和我的意图。 - Barth
2
好的,没问题,我会去了解一下 :) 我猜如果有人在点踩的同时附上评论来解释为什么要点踩的话,这会有所帮助。我们就把这些都忘掉吧。 - Barth
1
@TadeuszKopec 是的,这正是我注意到的 :-) - Barth
显示剩余3条评论
4个回答

20

使用

#include <string.h>
或者
#include <cstring>

代替

#include <string>

string头文件是用于C++的std::string。而string.h则是用于C风格的以零结尾的char*字符串。但cstring与string.h类似,适用于C++。

在gcc下它能工作的原因可能是有不同的警告/错误级别设置。即使没有包含头文件和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 类的 == 运算符完成。


1
string.h 是 C 语言的头文件;适当的 C++ 头文件是 cstring,因为它将所有内容保留在 namespace std 中。 - Griwes
@Griwes 好的,知道了。似乎在C++中使用string.h没有任何缺点。 - Tomas Andrle
我接受这个答案,因为它给出了我觉得有趣的解释。 - Barth
@TomasAndrle 注意,在C++中,string.h已经被弃用,应避免使用它。 - tambre

11

您没有包含正确的头文件

#include <cstring>

5
你需要包含 #include <cstring>(或者可能是 #include <string.h>)。
很多编译器在你包含其他头文件时会自动包含额外的标准库头文件。标准允许这样做;你需要使用能够保证你使用的声明的头文件,而不仅仅是恰好包含你编译器所需声明的头文件。

string.h 是 C 的头文件;唯一适当的 C++ 头文件是 cstring,因为它将所有内容保留在 namespace std 中。 - Griwes
@DaveS,有证据吗?我在标准中找不到任何关于它们被弃用的信息。 - Griwes
@Griwes:哎呀,我完全误读了这一部分。我已经删除了评论。 - Dave S

3

您需要包含<cstring><string>是C++字符串的头文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接