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

    文章

    7618

    浏览量

    138623
  • 代码
    +关注

    关注

    30

    文章

    4857

    浏览量

    69514

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

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

收藏 人收藏

    相关推荐

    C6748的McBSP接口能不能读ad1271的转化数据?

    AD1271可以工作在两种模式,一种是SPI;另一种是Frame Sync,我如果用C6748的McBSP接口能不能读ad1271的转化数据?
    发表于 01-01 07:22

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

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

    使用C语言实现函数模板

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

    编译器怎么处理同名头文件

    C语言中的include很简单,但不是你想象中的简单。
    的头像 发表于 11-05 16:51 495次阅读
    编译器怎么处理同名<b class='flag-5'>头文件</b>

    C语言中的socket编程基础

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

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

    电子发烧友网站提供《一体成型电感外壳破损还能不能用.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 523次阅读

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

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

    重复头文件的固定结构

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

    c语言中从左到右结合怎么看

    C语言中,操作符的结合性(Associativity)是指当操作符在表达式中连续出现时,它们如何与操作数结合的顺序。对于大多数二元操作符(即需要两个操作数的操作符),C语言遵循两种基
    的头像 发表于 08-20 11:42 1169次阅读

    能不能增大LWIP sockets数超过16个?

    “sys/types.h”限制FD_SETSIZE为64。公司的项目用ESP32方案,用到了很多组播,还有个服务端,配置文件限制了LWIP能使用sockets数最大为16,则分配socket号从48开始,一旦超过63就会导致select失败。请问下,能不能增大LWIP s
    发表于 06-13 07:47

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

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

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

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

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

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