c语言调用编译器的函数 在编译器调用函数时选择函数的依据

c语言中怎么调用函数?谢谢C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表 。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式 。各实参之间用逗号分隔 。
#includestdio.h
int fun(int x, int y); // 函数声明,如果函数写在被调用处之前,可以不用声明
void main()
{
int a=1, b=2, c;
c = fun(a, b); // 函数的调用,调用自定义函数fun,其中a , b为实际参数,传递给被调用函数的输入值
}
// 自定义函数fun
int fun(int x, int y)// 函数首部
{// {}中的语言为函数体
return xy ? x : y;// 返回x和y中较大的一个数
}
扩展资料
C语言中不允许作嵌套的函数定义 。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题 。但是C语言允许在一个函数的定义中出现对另一个函数的调用 。
这样就出现了函数的嵌套调用 。即在被调函数中又调用其它函数 。这与其它语言的子程序嵌套的情形是类似的 。其关系可表示如图 。
图表示了两层嵌套的情形 。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数 , b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行 。
参考资料:函数调用_百度百科
关于C语言main函数的调用在C语言中 , main函数可被递归调用
在C++标准中,main函数不可以被递归调用
但是许多C++编译器对标准作出了扩展,使得main函数可以被递归调用 。
可以用Visual
C++做个实验
【c语言调用编译器的函数 在编译器调用函数时选择函数的依据】1)用/Tc编译器选项(使用C编译器) , main可以递归调用
2)用/Tp(编译C++)和/Ze(启用语言扩展),main可以递归调用
3)用/Tp(编译C++)和/Za(禁用语言扩展),
main不可以递归调用
另外,根据我的经验 , 90%的C/C++书籍作者对C/C++并不是完全了解 。只有看经典书籍才能在技术细节上没有错误或模糊 。
在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?因为c++编译时会进行名变化,而C不会 , 导致无法找到函数等 。
要禁止名变换,使用C++的extern 'C'指示 。
详见
Item M34:如何在同一程序中混合使用C++和C
许多年来,你一直担心编制程序时一部分使用C++一部分使用C,就如同在全部用C编程的年代同时使用多个编译器来生成程序一样 。没办法多编译器编程的,除非不同的编译器在与实现相关的特性(如int和double的字节大小,传参方式)上相同 。但这个问题在语言的标准化中被忽略了,所以唯一的办法就是两个编译器的生产商承诺它们间兼容 。C++和C混合编程时同样是这个问题,所以在实体混合编程前 , 确保你的C++编译器和C编译器兼容 。
确认兼容后,还有四个要考虑的问题:名变换,静态初始化,内存动态分配,数据结构兼容 。
* 名变换
名变换,就是C++编译器给程序的每个函数换一个独一无二的名字 。在C中,这个过程是不需要的 , 因为没有函数重载,但几乎所有C++程序都有函数重名(例如 , 流运行库就申明了几个版本的operator和operator) 。重载不兼容于绝大部分链接程序,因为链接程序通常无法分辨同名的函数 。名变换是对链接程序的妥协;链接程序通常坚持函数名必须独一无二 。
如果只在C++范围内 , 名变换不会影响你 。如果你你有一个函数叫drawline而编译器将它变换为xyzzy,你总使用名字drawLine,不会注意到背后的obj文件引用的是xyzzy的 。

推荐阅读