我有一个比较两个字符串的基本程序:
#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编译?
编辑:人们对堆栈溢出越来越苛刻,直到我不愿意发布问题。上面的问题有一个简单的答案,很好,但是向下投票问题是正常的(在第一分钟两次!),因为他们有一个简单但不明显的答案?答案 0 :(得分:14)
使用
#include <string.h>
或
#include <cstring>
而不是
#include <string>
字符串标头用于C ++中的std :: string。 string.h 用于C零终止字符*字符串。 cstring 类似于string.h,但对于C ++。
它与gcc一起工作的原因可能是不同的警告/错误级别设置。可以编译代码而不用#including标头并具有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 class。
答案 1 :(得分:11)
您没有包含正确的头文件
#include <cstring>
答案 2 :(得分:5)
您需要#include <cstring>
(或可能#include <string.h>
。)
当您包含另一个时,许多编译器都包含额外的标准标头。标准允许这样做;您有责任使用保证声明所使用内容的标头,而不仅仅是恰好具有编译器声明的标头。
答案 3 :(得分:3)
您必须加入<cstring>
。 <string>
是C ++字符串的标题。