2019独角兽企业重金招聘Python工程师标准>>>

  1. 今天在复习C的时候,看到关于#include语句的一个解释,如果B 中 #include A,就是将文件A拷贝到#include A的位置中。

  2. 根据这个原理,于是做了一个实验。在头文件中定义一个变量(非静态变量),同时声明一个fun函数。再写一个fun.c文件,fun.c文件中实现了fun函数,最后写一个main.c文件调用fun函数。

  3. 三个文件的源代码如下:

test.h
#include <stdio.h>
#include <stdlib.h>void fun();
int com;
fun.c
#include "test.h"void fun(){com = 0;
}
main.c
#include "test.h"
int main(){com = 4;fun();printf("%d\n", com);return 0;
}

, 很明显在链接的时候必然会出现“multiple definition of `com'”。一般而言也不会在头文件中定义变量和函数。只可以声明变量,比如使用static可以在头文件中声明变量。如下所示:

test.h
#include <stdio.h>
#include <stdlib.h>void fun();
static int com;

其他两个文件不做改动,编译、链接和运行都没有报错,输出结果是4. 因为静态变量存储静态存储区,但是静态变量的作用域是一个文件,fun.c, main.c都会为com定义一个本地变量,因此,fun对com的改动不会影响main中的com. 如果希望在fun.c中的改动对main有效果,可以使用extern.

test.h
test.h
#include <stdio.h>
#include <stdlib.h>void fun();
extern int com;
main.c
#include "test.h"int com;
int main(){com = 4;fun();printf("%d\n", com);return 0;
}

fun.c 无须改动,此时,程序的输出结果是0。

总结以下:extern变量可以声明一个外部变量,使得编译顺利用过,但是在链接之后才得到实际的变量。每一个文件中定义的静态变量都会在静态存储区中分别分配一个空间,静态全局变量的作用域是该文件。在头文件中一般不会直接定义变量和函数,仅仅作声明。

转载于:https://my.oschina.net/u/2368952/blog/415944

关于头文件,全局变量,extern,static相关推荐

  1. C语言中:在头文件中使用static定义变量意味着什么?

    C语言中:在头文件中使用static定义变量意味着什么? 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const wchar_t* ...

  2. 关于头文件中的 static inline函数

    关于头文件中的 static inline函数 头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-n ...

  3. extern 用法,全局变量与头文件(重复定义)

    转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int  ...

  4. 头文件中定义全局变量

    引言 这些天写的程序中用到了全局变量,一开始是在一个文件下做测试后来把文件按逻辑拆分了一下,不同的代码被放在了几个文件中,最后用Makefile来编译就遇到了今天的话题,怎么在头文件中定义全局变量呢? ...

  5. c语言头文件中定义inline static相关函数的优劣

    头文件中常见static inline函数,于是思考有可能遇到的问题,如头文件经常会被包含会不会产生很多副本?网上说法不一.于是自己验证.经过arm-none-eabi-gcc下测试后得出结论. in ...

  6. C/C++头文件与变量的声明和定义

    版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/mountzf/article/deta ...

  7. C语言的艺术之——头文件

    好记性不如烂笔头o(^▽^)o 系列的文章: <C语言的艺术之--头文件> <C语言的艺术之--函数> <C语言的艺术之--标识符命令与定义> <C语言的艺术 ...

  8. 嵌入式linux头文件,飞凌嵌入式知识汇092期:C工程的组织方式(头文件的功能)以及Linux下常用的头文件的作用...

    1.1每个C++/C程序通常分为两个文件.一个文件用于保存程序的声明(declaration),称为头文件.另一个文件用于保存程序的实现(implementation),称为定义(definition ...

  9. 头文件防卫式声明/引用/static/extern/

    文章目录 1.头文件防卫式声明 2.引用 2.1 引用的本质 2.2 引用与指针的区别(特别的const指针?) 2.3引用传递和引用返回 3.static 3.1 静态局部变量 3.2 全局变量 3 ...

最新文章

  1. Android SurfaceView 绘图及帧频处理方法修正
  2. 系统目录结构文件类型及ls.alias命令
  3. npm 安装less插件_node+npm+webpack+less安装
  4. leetcode面试题 04.03. 特定深度节点链表(bfs)
  5. C++关联容器总结一
  6. spark job运行参数优化
  7. docker pull理解误区
  8. 发的楷体怎么写_孩子作业实在写不完,父母该怎么办?我直接给老师发信息
  9. C语言如何去掉非数字字符串,Objective-C中利用正则去除非数字字母汉字方法实例...
  10. TP5 ZipArchive 的坑
  11. 小米max刷鸿蒙,小米Max刷recovery教程 小米Max第三方recovery下载
  12. JLink OB STM32F072 固件的过程
  13. [反汇编练习] 160个CrackMe之016
  14. 数字信号处理知识点总结(三):离散傅里叶变换(DFT)
  15. C#-Winform知识点
  16. 【Ranger】编译问题An Ant BuildException has occured: exec returned: 1
  17. ASP.NET AJAX Control Toolkit 实现按拼音模糊检索下拉框
  18. [Pytorch系列-35]:卷积神经网络 - 搭建LeNet-5网络与CFAR10分类数据集
  19. 方舟服务器建家位置,《方舟生存进化》五种建家位置!每一种都能暴露建造者的种类!...
  20. rtx3080和rtx3080ti性能差距 rtx3080和rtx3080ti 参数对比哪个好

热门文章

  1. Java——类和对象
  2. 接口测试--apipost如何自定义header中的content-type
  3. Python Excel工具类封装, 实现excel表头加颜色
  4. pip install 报错 Error: Cannot uninstall ‘pyparsing‘ 的解决方法
  5. echarts 饼图移动端_VUE移动端项目中使用Echart
  6. Selenium API-鼠标与键盘事件
  7. Navicat连接虚拟机Linux的数据库时,出现错误代码“10038”
  8. 360浏览器保存密码设置_电脑小技巧查看浏览器保存的系统账号密码
  9. 某程序员9点离岗被主管罚款200,写bug扣光主管年终奖?
  10. 为什么学习web前端,必须掌握JavaScript这门编程语言