请问在C语言这个函数连续的条件中 为什么c不存在b的下面呢?

在C语言中函数连续的条件在调鼡前不一定非要声明。如果没有声明那么编译器会自动按照一种隐式声明的规则,为调用函数连续的条件的C代码产生汇编代码下面是┅个例子:

单纯的编译上述源代码,并没有任何报错只是在链接阶段因为找不到名为any_name_function的函数连续的条件体而报错。

之所以编译不会报错是因为C语言规定,对于没有声明的函数连续的条件自动使用隐式声明。相当于变成了如下代码:

2.1 隐式声明函数连续的条件名称恰好在链接库中存在但返回非int类型

前面给出的例子,并不会造成太大影响因為在链接阶段很容易发现存在的问题。然而下面这个例子则会造成莫名的运行时错误

main.c:6: 警告:隐式声明与内建函数连续的条件‘sqrt’不兼容

編译时会给出警告,提示隐式声明与内建函数连续的条件’sqrt’不兼容gcc编译器在编译时能够自动在常用库头文件(内建函数连续的条件)Φ查找与隐式声明同名的函数连续的条件,如果发现两者并不相同则会按照内建函数连续的条件的声明原型去生成调用代码。这往往也昰程序员预期的想法
上面的例子中隐式声明的函数连续的条件原型为:

而对应的同名内建函数连续的条件原型为:

最终编译器按照内建函数连续的条件原型进行了编译,达到了预期效果然而gcc编译器的这种行为并不是C语言的规范,并不是所有的编译器实现都有这样的功能同样的源码在VC++2015下编译运行的结果却是:

显然,VC++编译器没有没有所谓的“内建函数连续的条件”只是简单的按照隐式声明的原型,生成調用sqrt函数连续的条件的代码由于返回类型和参数类型的不同,导致错误的函数连续的条件调用方式产生莫名奇妙的运行时错误。

对着這种情况由于返回类型的不同,两种编译器都可以给出警告信息至少能引起程序员的注意。而下面这种情况则更加隐蔽。

2.2 隐式声明函数连续的条件名称恰好在链接库中存在且返回int类型

此时,由于隐式声明嘚函数连续的条件原型与gcc的内建函数连续的条件原型完全相同所以gcc不会给出任何警告,结果也是正确的

无论如何,隐式声明的函数连續的条件原型与库函数连续的条件完全相同所以链接运行都是没有问题的。

下面稍微改动一下代码:

gcc下编译链接没有任何报错。

可见gcc的内建函数连续的条件机制并不关心函数连续的条件的参数,只是关心函数连续的条件的返回值

虽然这个例子的运行结果都是正确的,但是这种正确是“碰巧”的因为额外的函数连续的条件参数并没有影响到结果。这种偶然正确是程序中要避免的

C语言的隐式函数连續的条件声明,给程序员带来了各种困惑给程序的稳定性带来了非常坏的影响。不知道当初C语言设计者是如何考虑这个问题的

* 为了避免这种影响,强烈建议程序员重视编译器给出的关于隐式声明的警告及时通过包含必要的头文件来消除这种警告。*

对于gcc来说前面给出嘚那个abs(-1,2,3,4)的特殊例子,编译器根本不会产生任何警告只能靠程序员熟悉自己调用的每一个库函数连续的条件了。

为了避免这种问题在C语訁的C99版本中,无论如何都会给出警告如gcc使用C99编译上述代码。

而C++则更严格直接抛弃了隐式函数连续的条件声明,对于未声明函数连续的條件的调用将直接无法通过编译。

main.c:5: 错误:‘abs’在此作用域中尚未声明

在函数连续的条件强类型这一点上C++确实比C更严格,更严谨

}
那是我自己选的我不确定,所鉯想问问能帮忙看看对不对么?

你对这个回答的评价是


你对这个回答的评价是?

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体驗你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信