使用strcmp函数时,不用包含头文件也行,是什么原因

时间:2021-10-05 16:41:53
#include<iostream>
using namespace std;
void main()
{
char a[]="lhu";
char b[]="li";
char c[]="lhi";
char d[]="lhu";
int i;
i=strcmp(a,b);
cout<<i<<endl;
i=strcmp(a,c);
cout<<i<<'\n';
i=strcmp(a,d);
cout<<i<<'\n';
}

========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

10 个解决方案

#1


因为标准库..

#2


包含头文件是为了声明函数。

c++要求调用函数前必须有声明。
c语言的要求就不这么严格,如果调用一个函数的之前没有声明,编译器会按照调用的方式自动生成一个默认声明,返回int,参数和调用的参数一致。
由于strcmp本来就是返回int的,所以默认声明和正确的声明刚好一致,不会有什么问题。

#3


我用g++编译不过,用vs2005可以编译。
看来编译器可以自己决定如何处理这种情况,vs可能包含了常用库函数的声明。

#4


strcmp能将字符数组与字符串常量进行比较吗?

#5


能~~!

#6


引用 3 楼 *mill 的回复:
我用g++编译不过,用vs2005可以编译。
看来编译器可以自己决定如何处理这种情况,vs可能包含了常用库函数的声明。

VS的预编译选项?

#7


因为在vs2005中,iostream头文件间接包含了string.h
而在g++中没有

#8


引用 7 楼 cphj 的回复:
因为在vs2005中,iostream头文件间接包含了string.h
而在g++中没有

这才是正解,还包括了stdio.h

#9


引用 2 楼 *mill 的回复:
包含头文件是为了声明函数。

c++要求调用函数前必须有声明。
c语言的要求就不这么严格,如果调用一个函数的之前没有声明,编译器会按照调用的方式自动生成一个默认声明,返回int,参数和调用的参数一致。
由于strcmp本来就是返回int的,所以默认声明和正确的声明刚好一致,不会有什么问题。

没错,但这种情况下会有一个警告的

#10


还有很多函数,比如swap等等 也能直接使用的
#include <iostream.h>
//using namespace std;
int main()
{
int a, b;
swap(a, b);
return 0;
}
这样就不行了,这些常用函数都被集成到名空间std中了

#1


因为标准库..

#2


包含头文件是为了声明函数。

c++要求调用函数前必须有声明。
c语言的要求就不这么严格,如果调用一个函数的之前没有声明,编译器会按照调用的方式自动生成一个默认声明,返回int,参数和调用的参数一致。
由于strcmp本来就是返回int的,所以默认声明和正确的声明刚好一致,不会有什么问题。

#3


我用g++编译不过,用vs2005可以编译。
看来编译器可以自己决定如何处理这种情况,vs可能包含了常用库函数的声明。

#4


strcmp能将字符数组与字符串常量进行比较吗?

#5


能~~!

#6


引用 3 楼 *mill 的回复:
我用g++编译不过,用vs2005可以编译。
看来编译器可以自己决定如何处理这种情况,vs可能包含了常用库函数的声明。

VS的预编译选项?

#7


因为在vs2005中,iostream头文件间接包含了string.h
而在g++中没有

#8


引用 7 楼 cphj 的回复:
因为在vs2005中,iostream头文件间接包含了string.h
而在g++中没有

这才是正解,还包括了stdio.h

#9


引用 2 楼 *mill 的回复:
包含头文件是为了声明函数。

c++要求调用函数前必须有声明。
c语言的要求就不这么严格,如果调用一个函数的之前没有声明,编译器会按照调用的方式自动生成一个默认声明,返回int,参数和调用的参数一致。
由于strcmp本来就是返回int的,所以默认声明和正确的声明刚好一致,不会有什么问题。

没错,但这种情况下会有一个警告的

#10


还有很多函数,比如swap等等 也能直接使用的
#include <iostream.h>
//using namespace std;
int main()
{
int a, b;
swap(a, b);
return 0;
}
这样就不行了,这些常用函数都被集成到名空间std中了