???VS2008 C++不对函数参数个数做检查吗?

gong_max 2009-09-16 04:45:00
int test(int a,int b,int c)
{
return 11;
}

int main()
{
int i1=1,i2=2,i3=3,i;
i=test(i1,i2);
return 0;
}

竟然编译成功,可以运行。
这是为虾米呢????
我在VC6里面使用同样的语句,会报参数个数不争取的错误,为啥VS2008 竟然编译通过呢?编译器没有VC6的严格??
...全文
175 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinghuashihun 2010-08-23
  • 打赏
  • 举报
回复
max是一个系统函数,参数有两个,你这调用的是系统的求最大值函数,不是自己写的那个函数……
skyworth98 2009-12-18
  • 打赏
  • 举报
回复
命名空间中有同名函数,且原型相同,晕

[Quote=引用 4 楼 gong_max 的回复:]
引用 1 楼 wangk 的回复:
test的声明是不是有int test(int a,int b,int c=1)类似的默认参数列表,还是有其他的重载函数?

没有给出默认值,也没有重载。我又测试了一下,如果是下面的代码:
C/C++ code
#include"stdafx.h"
#include<iostream>usingnamespace std;int max(int a,int b,int c){return1;
}int main(){int i1=1,i2=2,i3=3,i;
i=max(i1,i2);return0;
}
那么编译通过,可以运行。
如果去掉上面代码中的using namespace std;这一句话,变成下面的这种
C/C++ code
#include"stdafx.h"
#include<iostream>usingnamespace std;int max(int a,int b,int c){return1;
}int main(){int i1=1,i2=2,i3=3,i;
i=max(i1,i2);return0;
}
就会提示参数个数不正确
[/Quote]
grpubr 2009-11-19
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
using namespace std;


int max(int a,int b,int c){
return 1;
}
int main(){
int i1=1,i2=2,i3=3,i;
i=max(i1,i2);
return 0;
}

这个出的问题,因为有个std::max的函数,你的i=max(i1,i2);调用的是范型里的这个。
尽量不要使用using namespace std;这样的方式,会导致污染的.
应该使用
using std::string;这样
或者是
namespace my_tcp=boost::asio::ip::tcp;
hunterljm 2009-09-16
  • 打赏
  • 举报
回复
学习学习~~
CoderOfVC 2009-09-16
  • 打赏
  • 举报
回复
晕。。大家回复得还真快。。
CoderOfVC 2009-09-16
  • 打赏
  • 举报
回复
你测试一下这里调用的max函数是不是你自己写的?直接返回值看一下吧。。。

很有可能是调用了系统定义的函数。。。

algorithm这个头文件里也有max函数的定义,不知道是不是你在哪里加了这个头文件没有。。
I_NBFA 2009-09-16
  • 打赏
  • 举报
回复
我告诉你为什么吧,标准STL里有max函数,你using namespace std就把std命名空间引进来了,
实际上你调用的不是自己的max, 而是std::max.
gong_max 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jingzhongrong 的回复:]
在STL里面有max的两个参数的模板函数,你include了iostream,也用了std空间。

你可以把断点设置在max单步调试查看。
[/Quote]
谢谢蝈蝈,遇到问题不能主观臆断,断点调试靠谱!
gong_max 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuxinyang 的回复:]
引用 7 楼 gong_max 的回复:
大家帮我找找原因,哪里的问题


楼主大哥,你把你定义的max函数删了,也可以正常编译通过,你相信吗?
[/Quote]
见笑,见笑。
jingzhongrong 2009-09-16
  • 打赏
  • 举报
回复
在STL里面有max的两个参数的模板函数,你include了iostream,也用了std空间。

你可以把断点设置在max单步调试查看。
gong_max 2009-09-16
  • 打赏
  • 举报
回复
谢谢蝈蝈们,我找到原因了。是因为std命名空间中有一个max函数,导致重载。因此编译器不报错!!
这样又引出一个问题,蝈蝈们在编写C++程序时对于需要使用std命名空间中的函数,都采用std::,而不采用在文件头声明的方式呢?
WuXinyang 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gong_max 的回复:]
大家帮我找找原因,哪里的问题
[/Quote]

楼主大哥,你把你定义的max函数删了,也可以正常编译通过,你相信吗?
gong_max 2009-09-16
  • 打赏
  • 举报
回复

大家帮我找找原因,哪里的问题
gong_max 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wutaihua 的回复:]
楼主,我这里用VS2008测试过了,在console程序中,你所写的函数编译不过,test函数出错了,参数为2个
[/Quote]
蝈蝈,你按照我说的,在前面加上using namespace std;再编译试试
岁月小龙 2009-09-16
  • 打赏
  • 举报
回复
不要怀疑VS2008,从自身找原因
gong_max 2009-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangk 的回复:]
test的声明是不是有int test(int a,int b,int c=1)类似的默认参数列表,还是有其他的重载函数?
[/Quote]
没有给出默认值,也没有重载。我又测试了一下,如果是下面的代码:

#include "stdafx.h"
#include <iostream>
using namespace std;


int max(int a,int b,int c){
return 1;
}
int main(){
int i1=1,i2=2,i3=3,i;
i=max(i1,i2);
return 0;
}

那么编译通过,可以运行。
如果去掉上面代码中的using namespace std;这一句话,变成下面的这种

#include "stdafx.h"
#include <iostream>
using namespace std;


int max(int a,int b,int c){
return 1;
}
int main(){
int i1=1,i2=2,i3=3,i;
i=max(i1,i2);
return 0;
}

就会提示参数个数不正确
wutaihua 2009-09-16
  • 打赏
  • 举报
回复
楼主,我这里用VS2008测试过了,在console程序中,你所写的函数编译不过,test函数出错了,参数为2个
season030441 2009-09-16
  • 打赏
  • 举报
回复
同意一楼,不是有默认参数表 就是还有重载函数
wangk 2009-09-16
  • 打赏
  • 举报
回复
test的声明是不是有int test(int a,int b,int c=1)类似的默认参数列表,还是有其他的重载函数?

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧