c语言隐式函数声明

一直觉得写了这么久代码,对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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近在编程时遇到一个bug,通过gdb定位到printf函数,却怎么也找不到原因。从网上这篇博客中发现了问题所在:...
    creepycool阅读 1,928评论 0 0
  • 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过...
    小5筒阅读 5,564评论 0 3
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 函数基本概念 C源程序是由函数组成的例如: 我们前面学习的课程当中,通过main函数+scanf函数+printf...
    极客江南阅读 1,376评论 1 14
  • pwd返回了根目录 这时候看到系统返回了一个 /,这个 / 被我们称为系统的 根目录(root),这个位置也就是我...
    夏威夷的芒果阅读 757评论 0 1