求教关于编译器对参数检查的问题

遥路远碧海示心 2014-04-24 04:50:40
#include <stdio.h>
void test(const char * p1,const char * p2)
{
;
}

void main()
{
const char * p1 = "hello";
const char * p2 = "nihao";
const char * p3 = "nihao";
test(p1,p2,p3);
system("pause");
}
将此代码贴在vs2008上并将后缀改为.c则运行无误,若为.cpp则必报错。
请问这是和vs2008对不同类型源文件的参数检查不同吗
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-04-25
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
  • 打赏
  • 举报
回复
引用 8 楼 PDD123 的回复:
[quote=引用 6 楼 u010450027 的回复:] [quote=引用 2 楼 PDD123 的回复:] test函数只有两个参数,你弄了三个参数进去,可能不报错么?
你测试了吗?可以通过吗[/quote] 竟然真的可以,只是有一个参数太多的警告。 不过反编译后看,这个函数编译出来的格式不符合标准,其使用寄存器和栈传递参数,并且也不对栈进行维护,函数结束时的指令为: retn 所有入栈参数都在函数外出栈,类似于printf那种。[/quote] 请叫以下如何反编译,我是个菜鸟,你说的指令需要懂汇编吗
PDD123 2014-04-25
  • 打赏
  • 举报
回复
引用 6 楼 u010450027 的回复:
[quote=引用 2 楼 PDD123 的回复:] test函数只有两个参数,你弄了三个参数进去,可能不报错么?
你测试了吗?可以通过吗[/quote] 竟然真的可以,只是有一个参数太多的警告。 不过反编译后看,这个函数编译出来的格式不符合标准,其使用寄存器和栈传递参数,并且也不对栈进行维护,函数结束时的指令为: retn 所有入栈参数都在函数外出栈,类似于printf那种。
  • 打赏
  • 举报
回复
引用 4 楼 oYinGui1 的回复:
Test不是两个参数么。。。怎么传三个进去了。。。而且如果参数是const char*的话,传char* or const char *都是可以的。
麻烦你先试一个我说的是否正确
  • 打赏
  • 举报
回复
引用 2 楼 PDD123 的回复:
test函数只有两个参数,你弄了三个参数进去,可能不报错么?
你测试了吗?可以通过吗
  • 打赏
  • 举报
回复
引用 1 楼 baichi4141 的回复:
VS根据后缀名来调用编译器,c调用c编译器,cpp调用c++编译器 不过在我的理解中,楼主这种写法应该不管哪一个编译器都会报错,看来我对c的了解还是太浅了
你可以用编译器测一下看看能否通过,我用的是vs2008
PDD123 2014-04-25
  • 打赏
  • 举报
回复
引用 9 楼 u010450027 的回复:
[quote=引用 8 楼 PDD123 的回复:] [quote=引用 6 楼 u010450027 的回复:] [quote=引用 2 楼 PDD123 的回复:] test函数只有两个参数,你弄了三个参数进去,可能不报错么?
你测试了吗?可以通过吗[/quote] 竟然真的可以,只是有一个参数太多的警告。 不过反编译后看,这个函数编译出来的格式不符合标准,其使用寄存器和栈传递参数,并且也不对栈进行维护,函数结束时的指令为: retn 所有入栈参数都在函数外出栈,类似于printf那种。[/quote] 请叫以下如何反编译,我是个菜鸟,你说的指令需要懂汇编吗[/quote] 是要懂一点汇编,反编译都是使用一些反编译软件进行的。 我记得以前写C程序的时候,参数数量和类型对不上的话,是无法通过编译的,可能是VS 2008放宽了限制。 但是这种做法是不可取的,你一定要记住,函数的参数个数和类型一定要弄正确!!!
Morrisss_ 2014-04-24
  • 打赏
  • 举报
回复
Test不是两个参数么。。。怎么传三个进去了。。。而且如果参数是const char*的话,传char* or const char *都是可以的。
PDD123 2014-04-24
  • 打赏
  • 举报
回复
擦,后缀名改成.c就可以通过编译?
PDD123 2014-04-24
  • 打赏
  • 举报
回复
test函数只有两个参数,你弄了三个参数进去,可能不报错么?
baichi4141 2014-04-24
  • 打赏
  • 举报
回复
VS根据后缀名来调用编译器,c调用c编译器,cpp调用c++编译器 不过在我的理解中,楼主这种写法应该不管哪一个编译器都会报错,看来我对c的了解还是太浅了

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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