您的位置:首页 > 编程语言 > C语言/C++

c语言函数参数问题学习

2015-07-04 15:58 411 查看
c语言 声明函数时可省略形参名,编译器只检查参数类型和个数;

行参的作用是占位符,编译器会忽略;

C编译器在编译时忽略参数名,只检查函数的参数的类型和顺序是否与调用的函数匹配;


函数的参数入栈顺序 一般是从右到左;这个和编译器有关;

void本身就是一种类型,它属于不完整类型,把void作为形参的时候,它表示这个函数没有参数。

在C++中,空形参表与形参为void是等价的,这是C++的明确规定,但在C中则是两回事,C中的空形参表仅表示函数的形参个数和类型不确定,并非没有参数,这会暂时挂起编译器的类型检查机制,造成类型安全隐患,所以在C中欲表示函数没有形参时,最好用int foo( void ),不要使用int foo( );

---------------------------------------我是分割线---------------------------------------

c 允许空参数是为了兼容老标准,此时不提供参数类型检查,新标准一律用void:

c语言空参数函数是

void  func(void)

{

return ;

}

如果什么都不写,等同于

void fun(...){}

-------------------------------我是分割线-------------------------------------------

C语言支持函数重载吗? 

1.当然不支持……除非用一大把的MACRO来模拟,并且可能存在严重的Bug……
 
2.C语言标准就规定不允许同一作用域中两个函数重名。
 
和C语言相关的域有两种,一个是给编译器看得,还有一种是给链接器看的,而给编译器看的这种域主要是关于变量的可见范围,而链接器看到的那个是叫文件域,而全局域可能要跨越好几个文件域,这样只要两个同名函数用static修饰,并且在不同的文件中,就不会冲突……  

   

 不过这个实际上已经超越了编译器的范围,到达了链接器的管理区域了……表面看起来两个函数同名,但是实际上编译器为链接器产生的符号已经有了差别……
 
3.另外,函数重载是一个编译期行为,主要是通过name   mangling来产生不同的汇编符号,让linker可以正确的link代码

您有没有想过C++编译器是如何判断您调用的是重载中的哪个函数?即使它们的函数名相同。您也许会毫不犹豫的回答:是通过函数的参数表。其实识别的过程并不是像您想象中的那么的容易,其中涉及到参数的等级划分,参数转换等诸多方面,下面我就一一进行讲解。



  那么好,问题出现了。S (2.4 );将调用上面四个函数中的哪一个呢?

  编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。

  编译器判断重载函数的第二步分为两动作。第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S
( int ); S ( double , double )。

  如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。

  编译器判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。最佳可行函数即编译器要调用的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: