#ifndef PEOPLE_H

#define PEOPLE_H

/* … */

#endif

这样写能够防止头文件被重复包含

在头文件中定义变量不是不规范,而是一种错误。

原因在于

如果在header.h中定义一个变量。

int a = 0;

那么在

file1.c 里如果 #include “header.h”

那么在编译后的file1.o里就会定义一个全局变量a

同样的,

file2.c 里如果 #include “header.h”

那么在编译后的file2.o里就会定义一个全局变量a

在链接阶段,如果file1.o和file2.o链接在一起,变量a的定义就是重复的。

$ cat file1.c file2.c main.c header.h

/* file1.c */

#include "header.h"

/* file2.c */

#include "header.h"

/* main.c */

#include

#include "header.h"

int main(void)

{

printf("a=%d\n", a);

return 0;

}

/* header.h */

#ifndef HEADER_H

#define HEADER_H

int a = 0;

#endif

$ nm file1.o file2.o main.o

file1.o:

0000000000000000 B a

file2.o:

0000000000000000 B a

main.o:

0000000000000000 B a

0000000000000000 T main

U printf

$ gcc -o demo file1.o file2.o main.o

file2.o:(.bss+0x0): multiple definition of `a””

file1.o:(.bss+0x0): first defined here

main.o:(.bss+0x0): multiple definition of `a””

file1.o:(.bss+0x0): first defined here

collect2: ld 返回 1

正确的方法是,在header.h里声明变量,在一个单独的global.c文件里定义变量。

/* file1.c */

#include "header.h"

/* file2.c */

#include "header.h"

/* main.c */

#include

#include "header.h"

int main(void)

{

printf("a=%d\n", a);

return 0;

}

/* header.h */

#ifndef HEADER_H

#define HEADER_H

extern int a;

#endif

/* global.c */

int a = 0;

$ gcc -c file1.c file2.c main.c global.c

$ nm file1.o file2.o main.o global.o

file1.o:

file2.o:

main.o:

U a

0000000000000000 T main

U printf

global.o:

0000000000000000 B a

套头文件html重复,关于C++头文件重复包含的问题相关推荐

  1. python文件是怎么写_python头文件怎么写

    本文主要以python2为例.首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法.这两个部分就是Python中头文件的组成模块. 编程风格#!/usr/bin/e ...

  2. php头文件是什么,c++万能头文件是什么?

    c++万能头文件是:"#include".头文件是一种包含功能函数.数据接口声明的载体文件:其主要用于保存程序的声明,而定义文件用于保存程序的实现. 在C语言家族程序中,头文件被大 ...

  3. 基于F28335的Simulink代码生成(四)——如何链接可以访问底层文件的外部源文件和头文件

    基于F28335的Simulink代码生成系列文章目录 基于F28335的Simulink代码生成(一)--搞懂模型的运行逻辑 基于F28335的Simulink代码生成(二)--EPWM模块同步设置 ...

  4. c语言gets函数头文件string.h,string函数头文件

    string.h头文件中有什么函数 string.h头文件中的函数: #include //STL 通用算法 #include //STL 位集容器 #include //复数类 #include / ...

  5. 单片机C语言头文件如何写,51单片机头文件怎么写

    本文收集整理关于51单片机头文件怎么写的相关议题,使用内容导航快速到达. 内容导航: Q1:51单片机的头文件究竟该如何写 举个例子先判断是否被定义过,没定义就先定义好,主要就是防止重复包含 #ifn ...

  6. c语言头文件命名规则,C语言头文件规则.doc

    C语言头文件规则.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文档所得收 ...

  7. c语言有algorithm头文件吗,简单谈谈C++ 头文件系列之(algorithm)

    简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...

  8. linux sockaddr_in头文件,linux网络编程常用头文件

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函 ...

  9. java 输入输出头文件_引入的标准头文件与标准输出以及FOR循环

    感觉C学了一遍又一遍,大学学过,工作的时候也学过,奈何一直在弄JAVA,没有怎么用过C,学了就忘,忘了就....算了-- 现在搞音视频开发,又必须弄到这一块了.因此,写点东西回加强记忆.是的,基础本来 ...

最新文章

  1. vue中过渡动画(类名实现方式)
  2. 自制快速冒烟测试小工具--基于python多线程(1)
  3. java学习(103):字符串概述
  4. 手把手带你搭建Mvp+Dagger架构
  5. cocos2d-x的未来之旅
  6. oracle修改用户密码命令_oracle 11g dba用户秘密修改其他用户密码
  7. 整古专家之恶意批处理命令
  8. oracle在线重定义表分区,oracle把一张表在线重定义成分区表
  9. 任意多边形的最大内切圆算法
  10. python的bytes数据类型
  11. PAML中文文档/计算分子进化
  12. 2017-2018 ACM-ICPC, Asia Daejeon Regional Contest:Gym 101667K
  13. Redis五大数据类型常用命令
  14. 计算机组成原理:运算器组成实验(.八位串行可控加减法器等)
  15. 12年来最大飞跃!黄仁勋发布史上最强GPU,世界首个实时光线追踪新一代图灵架构...
  16. 计算机快捷键m是什么,电脑常用快捷键有哪些
  17. 一种无需调查船上坞的调查设备安装测量方法和安装测量系统
  18. 论文解读 | LGD:用于物体检测的标签引导自蒸馏
  19. Stata如何解决command is unrecognized?
  20. FckEditor中文配置手册详细说明

热门文章

  1. Mybatis中的事务提交
  2. OpenGL 实验一 绘制简单图形
  3. 一个博士在华为的22年!
  4. 人工智能专业好就业吗?AI就业前景
  5. 海南信用社计算机试题,2021年海南农村信用社计算机笔试内容17
  6. CF1146G Zoning Restrictions 最小割
  7. Linux系统下强制关闭程序
  8. 三折线弹塑性滞回模型matlab,考虑屈曲的钢筋滞回模型
  9. 【图像处理】双线性插值法扩展图像像素及其代码实现(亚像素)
  10. 微信小程序 - <image>图片 src 路径动态拼接多个变量