c语言函数的隐式声明

c语言里变量必须先声明后使用,函数也不例外,这点和js,php不一样。

double function(void){  return 100.0;
}

定义一个函数第一行,声明了函数的名字,参数类型个数,返回值,这称为函数原型,

函数原型也可单独写,不带函数体

double function(void);

编译器只有碰到函数原型的时候才知道这个函数的名字,参数类型个数返回值,到函数调用的时候才知道如何生成指令,所以函数原型必须出现在函数调用之前。

以下两段代码都能得到正确的结果。

#include<stdio.h>

double function(void){
    return 100.0;
}

int main(void){
    printf("%f", function());
    return 0;
}
#include<stdio.h>
int main(void){
    double function(void);//函数原型
    printf("%f", function());
    return 0;
}

double function(void){
    return 100.0;
}

如果去掉声明函数原型那一行。在main函数中调用function函数时并没有声明它,编译器认为此时隐士声明了int function(void);隐士声明的函数返回值都是int,由于我们调用function的时候没有传参数,所以编译器认为这个隐式函数的参数类型是void

然后编译器接着往下看,看到function函数的原型是 double function(void);和先前隐式声明的类型不一致。

所以报错 error: conflicting types for ‘function’  previous implicit declaration of ‘function’ was here

时间: 2024-10-20 04:48:11

c语言函数的隐式声明的相关文章

万恶之源:C语言中的隐式函数声明

1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码.并没有不论什么报错,仅仅是在链接阶段由于找不到名为any_name_function的函数体而报错. [[email protected] t

gcc函数隐式声明

最近看代码看到一些代码中直接使用了一些函数,但在编译的时候却没有任何错误,非常奇怪.在C语言中不是所有函数在使用之前都应该被定义或声明吗?查查资料发现原来gcc在碰到这种情况的时候会隐式为我们声明一下使用的函数,并且默认情况下,并不会触发警告.比如我们使用了一个未声明的函数hello,gcc会为我们声明一个int hello().如果加上-Wimplicit选项的话,我们就可以看见隐式声明的警告了:bootmain.c:6:2: warning: implicit declaration of

警告:隐式声明与内建函数&#39;exit&#39;不兼容解决方案

警告:隐式声明与内建函数'exit'不兼容解决方案 [cpp] view plaincopy #include <stdio.h> int main() { printf("hello world!/n"); exit(0); } 原因其实很简单了,没有把stdlib.h包含进来,加上就没问题了.后来google搜索的时候发现网上很多人有这个问题,今天来记下这个问题的解决方案. 以此类推,编译后出现警告:隐式声明与内建函数’XXX’不兼容的问题所在都是因为没有包含相应的头文

var与Javascript变量隐式声明

在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它.var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于"隐式"声明了一个变量y,在实际编程过程中,这种错误有时比较难以发现. 除此之外,今天通过同事介绍,了解到这种"隐式声明"

Android 5.0之后隐式声明Intent 启动Service引发的问题

一.概述 Android系统升级到5.0之后做了不少的变化(5.0变化),开发人员一定要注意这些变化,要不然就有的折腾了.这次最大的变化应该是把Dalvik虚拟机改成了ART(Android Runtime),后续会专门讲解这一块.其他的都是一些零碎的问题,例如前段时间发了一篇Android 5.0之后修改了HashMap的实现(传送门).这篇主要讲一下遇到跟Service相关的问题. 二.详情 Service身为Android四大组件之一,它的使用频率还是比较高的,并且现在主要都是运用在比较关

警告: 隐式声明与内建函数‘fabs’不兼容 [默认启用]

在linux下编程,经常出现警告:隐式声明与内建函数'XXX'不兼容 [默认启用],这类问题都是因为没有包含相应的头文件,加上就可以了. 出现警告"隐式声明与内建函数'fabs'不兼容 "时,加上头文件math.h即可.

《C语言 — 隐式函数声明implicit declaration 》

1. 隐式函数声明概念 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码,并没有任何报错,只是在链接阶段因为找不到名为any_name_function的函数体而报错. [[email protected] test]$ gcc

关于gcc内置函数和c隐式函数声明的认识以及一些推测

最近在看APUE,不愧是经典,看一点就收获一点.但是感觉有些东西还是没说清楚,需要自己动手验证一下,结果发现需要用gcc,就了解一下. 有时候,你在代码里面引用了一个函数但是没有包含相关的头文件,这个时候gcc报的错误比较诡异,一般是这样:[math.c:6:25: 警告:隐式声明与内建函数‘sin’不兼容 [默认启用]].这个错误网上大量博客都在说需要包含XXX.h文件,但是没有人解释这个错误信息为什么这样表达.什么是隐式声明,什么是内建函数,我就纠结了. 隐式声明函数的概念网上有相关的资料,

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转