0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言中的头文件能不能重复包含

学益得智能硬件 来源:学益得智能硬件 2024-11-26 17:19 次阅读

C语言中的头文件能不能重复包含?

比如代码写成这样,stdio.h 连续包含了两次。

#include 
#include 

int main()
{
    printf("helloworld
");
    return 0;
}

我们先来编译看下,好像没有任何问题。

root@Turbo:~# gcc test.c -o test 
root@Turbo:~#

同一个头文件,随便包含多少次,都不会有问题,主要是这两行代码起了作用。

#ifndef _STDIO_H
#define _STDIO_H    1

写头文件的时候,习惯上都会加上两个预处理指令,ifndef 和 define。

就以这个 test.h 为例:

#ifndefTEST_H
#define TEST_H

struct Test
{
    int a;
};

#endif

在 test.h 里面声明了一个结构体,然后在源文件中包含了两次。

头文件往往在编译的第一步,预处理的时候展开。

第一次展开 test.h 的时候,会遇到预处理指令 ifndef:

#ifndef TEST_H

翻译过来就是如果没有定义这个宏。

很显然,这个宏确实没有定义过,于是判断成立。

继续往下走,遇到 define:

#define TEST_H

意思就是把这个宏定义一下。

然后就是把 test.h 里面的内容搬到源文件中,这就是所谓的展开。

第二次包含 test.h 的时候,重复上面的操作。

先是遇到 ifndef,很显然,这个宏刚才定义过,于是这条预处理指令不成立,下面的所有代码都会跳过。

这样就清楚了,虽然我们在源码里面包含了 test.h,但是因为判断不成立,并没有真正的包含进去。

相同的头文件在一个源码文件中可以重复包含,因为预处理指令的存在,所以并不会出问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7605

    浏览量

    136941
  • 代码
    +关注

    关注

    30

    文章

    4790

    浏览量

    68655

原文标题:重复包含头文件有什么影响

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中申请的堆内存能不能自动释放

    C语言中申请的堆内存能不能自动释放?每次都要手动 free 太麻烦,也容易忘记。 学过 C++ 的同学,应该首先能想到智能指针。 但是这是C
    的头像 发表于 11-27 09:33 121次阅读

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 399次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 339次阅读

    一体成型电感外壳破损还能不能

    电子发烧友网站提供《一体成型电感外壳破损还能不能用.docx》资料免费下载
    发表于 10-31 10:57 0次下载

    TiNa里能不能加载HCNR的模型啊?

    我在用TI的运放配合HCNR201做一个隔离方案,想仿真一下,用的是Multisim,但是Multisim里的运放没有输出幅值对电源的限制,从TI网站上下载了一个扩展名是MOD的模型,在Multisim里无法加载,只能用.cir的文件。想问一下怎讲解决啊,或者TiNa里能不能
    发表于 09-14 07:39

    UTB定位技术能不能精准定位

    在当今科技日新月异的时代,定位技术以其广泛的应用场景和不断提升的精度,成为了多个领域的核心支撑。其中,UTB定位技术以其高精度、低延迟和高抗干扰性等特点,在众多定位技术中脱颖而出,成为精准定位领域的佼佼者。那么,UTB定位技术到底能不能精准定位呢?下面就给大家具体介绍一下关于UTB定位技术。
    的头像 发表于 09-03 10:07 369次阅读

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含
    的头像 发表于 09-02 10:37 2388次阅读

    重复头文件的固定结构

    年轻人,你可曾记得,在修习C语言的时候,见过这样的字句:在创建头文件的时候,一定要加入保护宏。
    的头像 发表于 08-29 10:23 356次阅读
    可<b class='flag-5'>重复</b><b class='flag-5'>头文件</b>的固定结构

    components包含头文件错误是怎么回事?

    我新建了一个工程,添加了一个BLE组件,现在我在BLE组件的头文件包含了如下文件Code: Select all #include \"api/esp_gatt_common_api.h
    发表于 06-06 07:21

    C语言中,同一个函数能不能被定义两次?

    稍微有点C语言基础的同学,一定知道不能这样做。
    的头像 发表于 05-11 18:27 1725次阅读

    请问头文件能不能定义变量呢?

    最近在编译一个工程的时候,突然遇到了变量重复定义的问题,根据提示打开这几个 C 文件,并没有发现定义变量的地方。后来再找一找,原来变量定义在了头文件里面。
    的头像 发表于 04-28 09:33 1170次阅读

    C语言中头文件

    #include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include 指令之后的文本输出。
    发表于 02-23 14:06 466次阅读

    C语言中的动态内存管理讲解

    本章将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。
    的头像 发表于 02-23 14:03 398次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>的动态内存管理讲解

    同VLAN不同的网段能不能互通?

    同VLAN不同的网段能不能互通? 同一个VLAN中的设备拥有相同的网络地址范围,因此它们可以通过该VLAN进行通信。而不同VLAN中的设备拥有不同的网络地址范围,它们通常不能直接互通。然而,在某些
    的头像 发表于 02-04 11:21 3126次阅读

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析

    如何解决C语言中的“访问权限冲突”异常?C语言引发异常原因分析  在C语言中,访问权限冲突异常通
    的头像 发表于 01-12 16:03 5773次阅读