这是src1.c的内容:

#include

extern int w;

//int go(char); // no need to declare here. WHY????

main(){

char a='f';

go(a);

printf("%d\n", w);

}

这是src2.c的内容:

#include

int w = 99;

int go(char t){

printf("%c\n%d\n",t,sizeof(t));

}

为什么在Linux中编译后,在src1.c文件中声明go函数是不是必须?

cc src1.c src2.c;

编译器是否将src2.c文件中的go函数定义放在main函数的代码上面,这样就不需要声明了?

我这样做:

#include

int go(char); // need to declare here, because if not, arguments of go will be promoted to intS and they would conflict with char parameters defined in go. Error is droped!

main(){

char a='f';

go(a);

}

int go(char t){

printf("%c\n%d\n",t,sizeof(t));

}

所以每个人都说,在没有原型的情况下传递任何数量和类型的参数是错误的.在这种情况下,它们被提升为整数,但必须同意定义中指定的那些.

我做了一些测试,发现即使它编译没有错误它也无法正常工作.

SRC1:

#include

int go(int t){

printf("%d\n%d\n",t,sizeof(t));

}

sr2.c:

#include

int go(int); //if I omit this prototype, program outputs 1 which is far from correct answer :)

main(){

double b=33453.834;

go(b);

}

所以最后答案只能是未定义的行为.

谢谢Maxim Skurydin

c语言多个子函数声明,C函数在多个源文件中的声明和定义相关推荐

  1. 一个java源文件中可以声明多少个class与编译后会生成多少个字节码文件

    在一个java源文件中可以声明多个class. 但是,只能最多有一个类声明为public的. 而且要求声明为public的类的类名必须与源文件名相同. 编译的过程 编译以后,会生成一个或多个字节码文件 ...

  2. mysql函数临时表_MySQL函数中创建临时表

    我们都知道,在MySQL创建函数的时候,是不能返回table类型的数据的. 我有几个疑问: 1.在function中我首先创建一个临时表: create temporary table table_t ...

  3. 【C语言进阶深度学习记录】三十八 C/C++语言中的函数声明与函数定义

    文章目录 1 函数的声明和定义 1.1 代码分析 2 总结 1 函数的声明和定义 声明的意义在于告诉编译器程序单元的存在.只是告诉编译器它存在但是不在声明这里定义,有可能在当前文件中的其他地方或者其他 ...

  4. c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...

    一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的. 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始 ...

  5. 脚本语言【JavaScript基础】JavaScript函数:声明+调用

    文章目录 在javaScript脚本语言当中:函数使用也是分为两部分:声明+调用 数组 在javaScript脚本语言当中:函数使用也是分为两部分:声明+调用 函数在JS当中声明方式有两种 关键字fu ...

  6. c语言goout函数,Go语言函数声明(函数定义)

    函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func.函数名.参数列表.返回值.函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块. 因为Go语言是编译型语言, ...

  7. 【C语言】函数的声明_函数定义_函数调用_函数递归 [函数的基本使用]

    文章目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.2 自定义函数 3.函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): 4.函数的调用 4.1 传值调用 ...

  8. c语言函数调用必须声明void,函数声明-czysocket_dara-ChinaUnix博客

    看了C陷阱与缺陷,第一个给我震撼的就是理解函数声明了,下面是我的理解. 1.理解函数声明 为了模拟开机启动时的情形,我们必须设计出一个C语句,以显示调用位于地址0的子例程.调用语句如下: (*(voi ...

  9. C语言函数声明以及函数原型

    C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错.但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明. 函数声明(Declaration),就是告诉编译器 ...

最新文章

  1. Oracle 中的SID是什么意思?有什么作用?
  2. 线程与进程的控制原语对比
  3. Dom对象、JavaScript对象、jQuery对象区别
  4. 6.过滤器(Filter)
  5. D-Wave的量子计算机,到底能不能进行量子计算?
  6. 语音识别(1)---语音识别(ASR)评估指标-WER(字错误率)和SER(句错误率)
  7. java word转pdf_java里实现Word转PDF的几种方案
  8. BiLSTM+CRF医学病例命名实体识别项目
  9. CCF201503-5 最小花费(100分解题链接)
  10. LeetCode 101. Symmetric Tree
  11. Android 学习之逐帧动画(Frame)
  12. 现代通信理论与新技术 - 填空自测
  13. 使用sort(function(a,b){return a-b})对数组进行排序的原理
  14. ST7920 12864液晶图片取模,显示你想显示的图片。
  15. 百度HI QQ和MSN 阿里旺旺贸易通MSN在线客服聊天代码
  16. Navicat Premium 12 中文版v12.1.19
  17. 使用Visio画UML模型
  18. 决策树CART、ID3、C4.5原理梳理
  19. 关于小区物业自治方案的探讨
  20. JavaScript 入门

热门文章

  1. LeetCode 116. 填充每个节点的下一个右侧节点指针(递归循环)
  2. Ubuntu Linux系统下搭建自己的Web服务器
  3. 猪八戒背媳妇用计算机弹出来,猪八戒背媳妇?杭城游泳馆爆笑一幕:浙大学霸果然机智!...
  4. 蛤蟆 Oracle,47.蛤蟆笔记go——go连接Oracle
  5. bigdecimal 保留两位小数_一起聊聊小数的储存和运算
  6. 李宏毅机器学习(五)Transformer
  7. 禁术级竞赛刷分技巧:找到跟测试集最接近的有标签样本
  8. Spring Boot中使用Redis数据库
  9. Spring Boot中使用@Scheduled创建定时任务
  10. RestQL:现代化的 API 开发方式