美文网首页程序员
c语言隐式函数声明

c语言隐式函数声明

作者: littlersmall | 来源:发表于2016-01-28 13:29 被阅读939次

一直觉得写了这么久代码,对c,或者c++的掌握还算不错,可是最近才发现,不了解的细节实在太多了。
比如下面这个例子:

// 1. c
int print_float(float f)
{
    return print("%f\n", f);
}
// 2. c
int main()
{
    int a = 1;
    
    print_float(a);
    
    return 0;
} 

gcc -c *.c && gcc -o test *.o && ./test

很简单的一段代码,可是打印出来的结果却是:
0.000000
为什么会出现这样的结果?其实就是题目中说道的:c的隐式声明。

如果没有关于被调函数的特定信息,编译器便假定在这个函数的调用时传递的参数类型和个数都是正确的,同时会假定函数返回一个整数类型的值。
但是如果被调函数的返回值不是整型,或者实参与形参不匹配,都将导致函数调用出现错误。

这个问题看似简单,却可以隐藏的非常深,而解决方式也无非就是秉持一种良好的编程习惯:

任何时候,都要声明函数。

比如在上面的例子中,只需要在main函数前面声明:int print_float(flat f),就可以了。

c和c++中类似这样的小问题,数不胜数。看来永远都没有精通c++的那一天了,想想都觉得好伤感。
(原文时间2014-3-18)

相关文章

  • c语言隐式函数声明

    一直觉得写了这么久代码,对c,或者c++的掌握还算不错,可是最近才发现,不了解的细节实在太多了。比如下面这个例子:...

  • C语言的函数原型

    C 语言可以不使用函数原型,但是这样会导致编译器无法正确检查函数的参数数目和参数类型。例子如下: 出现隐式函数声明...

  • Scala 隐式转换

    一、隐式转换 隐式转换需要执行隐式函数,隐式函数是以 implicit 关键字声明的带有单个参数的函数。隐式函数会...

  • 当C语言隐式函数声明遇到printf

    最近在编程时遇到一个bug,通过gdb定位到printf函数,却怎么也找不到原因。从网上这篇博客中发现了问题所在:...

  • Go 语言基础——变量常量的定义

    go语言不支持隐式类型转换,别名和原有类型也不能进行隐式类型转换go语言不支持隐式转换 变量 变量声明 声明变量不...

  • scala implicit 隐式转换和隐式参数

    1.什么是隐式转换和隐式参数?隐式转换是以implicit 声明的带有单个参数的函数隐式参数是函数或方法带有一个标...

  • C/C++ tip2

    explicit与隐式类型转换 在调用函数时,如果传给函数的参数和任何一个已经声明的同名函数都不匹配,那么c++编...

  • 10 C语言的妖怪!隐式声明

    缘起 相传2019年3月8日女神节,天降暴雨。在一个年轻程序员的电脑里,发生了一件奇异的事……他写了这样一个函数:...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • gcc

    C语言 c语言是面向函数的语言,所以c语言中全部都是函数 看看单文件中对函数的生命和调用。 要先对函数进行声明再进...

网友评论

    本文标题:c语言隐式函数声明

    本文链接:https://www.haomeiwen.com/subject/rqhjkttx.html