vs2013编译器通不过,别的编译器就能通过,这是为什么

时间:2020-12-16 09:11:08
#include<iostream>
using namespace std;

int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型
int main()
{
int a = -5, b = 3;
float c = -2.4f, d = 8.4f;
double e = -3e-9, f = 3e6;
cout << "a=" << abs(a) << endl << "b=" << abs(b) << endl;//输出函数返回的结果
cout << "c=" << abs(c) << endl << "d=" << abs(d) << endl;
cout << "e=" << abs(e) << endl << "f=" << abs(f) << endl;
return 0;
}
int abs(int a)//函数定义
{
cout << "int abs" << endl;//显示运行了哪个函数
return (a >= 0 ? a : -a);//如果a大于等于零则返回a,否则返回-a。
}
float abs(float a)
{
cout << "float abs" << endl;
return (a >= 0 ? a : -a);
}
double abs(double a)
{
cout << "double abs" << endl;
return (a >= 0 ? a : -a);
}

想知道为什么,这个程序为什么在vs2013上面通不过。知道是函数重载,基本知识点就不用回答了

4 个解决方案

#1


我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

#2


我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

#3


引用 2 楼 draculamx 的回复:
我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

是的 我后来发现了,我的电脑上面是vs2013,没有像2015提示的那么完整,再加上这个程序是别人发给我的,自己只关注了函数的重载问题,忽略了abs这个系统原有的函数定义。说明自己对程序还是没有理解到位或者说只是入门水平吧

#4


其实我更好奇,#include<iostream>之后,会自动包含 math.h ,这个在VS2015里面是默认的,原来的编译器, math.h貌似是需要程序员自己去手动包含的,我也看了一下 iostream 的源文件,没看出哪里包含了  math.h 。。。

#1


我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

#2


我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

#3


引用 2 楼 draculamx 的回复:
我机器上只有2015,试了一下,提示错误:
Severity Code Description Project File Line
Error C2382 'abs': redefinition; different exception specifications ConsoleApplication1 e:\360cloud\workspace\vc2015\consoleapplication1\consoleapplication1\source.cpp 9

提示abs这个函数重定义了,原因是#include<iostream>之后,会自动包含 math.h 到工程中,而 math.h 中,已经定义了三个函数:
_Check_return_ int       __cdecl abs(_In_ int _X);
_Check_return_ long      __cdecl labs(_In_ long _X);
_Check_return_ long long __cdecl llabs(_In_ long long _X);

和你自己定义的:
int abs(int a);//当参数为整型数据时的函数原型
float abs(float a);//当参数为浮点型数据时的函数原型
double abs(double a);//当参数为双精度型数据时的函数原型

发生了冲突
所以,你要做的只是把你自己定义的函数abs换个名字就行了。。。

是的 我后来发现了,我的电脑上面是vs2013,没有像2015提示的那么完整,再加上这个程序是别人发给我的,自己只关注了函数的重载问题,忽略了abs这个系统原有的函数定义。说明自己对程序还是没有理解到位或者说只是入门水平吧

#4


其实我更好奇,#include<iostream>之后,会自动包含 math.h ,这个在VS2015里面是默认的,原来的编译器, math.h貌似是需要程序员自己去手动包含的,我也看了一下 iostream 的源文件,没看出哪里包含了  math.h 。。。