1、如果没有定义,只有声明和调用:编译时会报连接错误。undefined reference to `func_in_a'
2、如果没有声明,只有定义和调用:编译时一般会报警告,极少数情况下不会报警告。但是最好加上声明。
3、如果没有调用,只有定义和声明:编译时一般会报警告(有一个函数没有使用),有时不会报警告。这时候程序执行不会出错,只是你白白的写了几个函数,而没有使用浪费掉了而已。

实验:在一个项目的两个.c文件中,分别定义一个名字相同的函数,结果?
编译报错 multiple definition of `func_in_a'
结论:在一个程序中,不管是一个文件内,还是该程序的多个文件内,都不能出现函数名重复的情况,一旦重复,编译器就会报错。主要是因为编译器不知道你调用该函数时到底调用的是哪个函数,编译器在调用函数时是根据函数名来识别不同的函数的。

跨文件的变量引用

(1)通过实验验证得出结论:在a.c中定义的全局变量,在a.c中可以使用,在b.c中不可以直接使用,编译时报错 error: ‘g_a’ undeclared (first use in this function)

(2)想在b.c中使用a.c中定义的全局变量,有一个间接的使用方式。在a.c中写一个函数,然后函数中使用a.c中定义的该全局变量,然后在b.c中先声明函数,再使用函数。即可达到在b.c中间接引用a.c中变量的目的。

(3)想在b.c中直接引用a.c中定义的全局变量g_a,则必须在b.c中引用前先声明g_a,如何声明变量? extern int g_a;

extern关键字: extern int g_a; 这句话是一个全局变量g_a的声明,这句话告诉编译器,我在外部(程序中 不是本文件的另一个文件)某个地方定义了一个全局变量 int g_a,而且我现在要在这里引用它 告诉你编译器一声,不用报错了。

问题:

1、我只在b.c中声明变量,但是别的文件中根本就定义这个变量,会怎么样? 答案是编译报错(连接错误)undefined reference to `g_b'

2、我在a.c中定义了全局变量g_a,但是b.c中没有声明g_a,引用该变量会怎么样? 答案是直接抱错了,未定义

3、在a.c中定义,在b.c中声明,a.c和b.c中都没有引用该变量,会怎么样? 答案是不会出错。只是白白的定义了一个变量没用,浪费了

结论:不管是函数还是变量,都有定义、声明、引用三要素。其中,定义是创造这个变量或者函数,声明是向编译器交代它的原型,引用是使用这个变量或函数。所以如果没有定义只有声明和引用,编译时一定会报错。undefined reference to `xxx'

在一个程序里面,一个函数可以定义一次,引用可以有无数次,声明可以有无数次。因为函数定义或者变量的定义实际上是创造了这个函数/变量,所以只能有一次。(多次创造同名的变量会造成变量名重复,冲突;多次创造同名的函数也会造成函数名重名冲突)。声明是告诉编译器变量/函数的原型,在每个引用了这个全局变量/函数的文件之前都要声明该变量/函数

局部变量能不能跨文件使用? 不能。因为局部变量属于代码块作用域。他的作用域只有他定义的那个函数内部。

静态局部变量能不能跨文件使用? 不能。因为本质上还是个局部变量。

讨论跨文件使用问题,只用讨论全局变量和函数就可以了

最新文章

  1. IOS Core Animation Advanced Techniques的学习笔记(三)
  2. javascript中数组和字符串的方法比较
  3. redis 学习笔记(5)-Spring与Jedis的集成
  4. ANT 环境搭建
  5. 20145236 《Java程序设计》实验四实验报告
  6. mysql分区(partition)
  7. java 环境变量设置
  8. whatwg-fetch源码分析
  9. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
  10. Subversion Edge部署
  11. BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
  12. Java总结:开发环境
  13. 为什么今天的L4无人驾驶无法到达终局(转)
  14. 友盟消息push功能
  15. mysql group replication 主节点宕机恢复
  16. Cause: org.xml.sax.SAXParseException; lineNumber: 45; columnNumber: 62; 元素内容必须由格式正确的字符数据或标记组成。
  17. Discoverer Table
  18. 常见HTTP状态码(200、301、302、500等) 释义
  19. 迷你MVVM框架 avalonjs 0.9发布
  20. Smarty简介

热门文章

  1. Java设计模式——Observer(观察者)模式
  2. c++11 : static_assert和 type traits
  3. 判断是否是IP地址
  4. response和request
  5. [Python爬虫笔记][随意找个博客入门(一)]
  6. CentOS6.7 下安装git
  7. 图形绘制 Canvas Paint Path 详解
  8. ORA-02095: specified initialization parameter cannot be modified
  9. POJ3111 K Best(另类背包+二分+变态精度)
  10. mongodb安装指南