【问题标题】:Why is strcmp unknown to clang?为什么 strcmp 对 clang 是未知的?
【发布时间】:2012-06-23 16:07:52
【问题描述】:

我有一个比较两个字符串的基本程序:

#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 编译?

编辑:人们对堆栈溢出越来越苛刻,以至于我正在犹豫是否要发布问题。上面的问题有一个简单的答案,很好,但是因为他们有一个简单但不明显的答案而对问题投反对票(在第一分钟两次!)是正常的吗?

【问题讨论】:

  • 我不知道为什么人们不赞成这个。它已明确说明并且是一个有效的问题。
  • “这个问题没有显示任何研究工作”。 Google 中第一次点击“strcmp”有一个带有#include &lt;string.h&gt; 的代码示例(这也是一个有效的解决方案)。最少的研究会回答这个问题。这就是我否决它的原因。琐碎的问题会降低这个网站的价值。
  • 做一个最小的例子并比较两个编译器的结果是研究工作。
  • 在发布之前,我将 Google 上第一个示例的代码复制并粘贴到一个文件中,并认为“我应该像我为 iostream 所做的那样从包含中删除这些 '.h'”。我错了,但肯定不是懒惰。此外,我的最小示例与 gcc 一起使用,因此我感到很惊讶。我认为您得出结论并判断我和我对此的意图有点快。
  • 好的,没问题,我会读一下 :) 我想如果否决票附带评论来解释为什么它被否决,那会有所帮助。让我们忘记这一切吧。

标签: c++ clang strcmp


【解决方案1】:

使用

#include <string.h>

#include <cstring>

而不是

#include <string>

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 类。

【讨论】:

  • string.h 是 C 头文件;正确的 C++ 标头是 cstring,因为它将所有内容都保存在 namespace std 中。
  • @Griwes 好的,很高兴知道。即使在 C++ 中使用 string.h 似乎也没有缺点。
  • 我认为这个答案已被接受,因为它给出了我觉得有趣的解释
  • @TomasAndrle 请注意,string.h 在 C++ 中已弃用,应避免使用它。
【解决方案2】:

您没有包含正确的头文件

#include <cstring>

【讨论】:

    【解决方案3】:

    您需要#include &lt;cstring&gt;(或者可能是#include &lt;string.h&gt;。)

    当您包含另一个标准头时,许多编译器会包含额外的标准头。该标准允许这样做;你有责任使用保证你使用的声明的头文件,而不仅仅是恰好有你的编译器声明的头文件。

    【讨论】:

    • string.h 是 C 头文件;只有正确的 C++ 标头是 cstring,因为它将所有内容都保存在 namespace std 中。
    • @DaveS,有什么证据吗?我找不到任何关于它们在标准中被弃用的信息。
    • @Griwes:哎呀。我完全误读了该部分。我已删除评论。
    【解决方案4】:

    您必须包含&lt;cstring&gt;&lt;string&gt; 是 C++ 字符串的标头。

    【讨论】:

      猜你喜欢
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多