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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144619
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    到底DDR走线能不能参考电源层啊?

    虽然我看到过DDR的走线参考电源平面也能调试成功的案例,但是依然不妨碍我还想问:到底DDR走线能不能参考电源层啊?
    的头像 发表于 11-11 17:44 509次阅读
    到底DDR走线<b class='flag-5'>能不能</b>参考电源层啊?

    头文件保护失效,提示变量重复包含,是什么原因导致的?

    我自定了一个头文件,而且使用了头文件保护机制。但是在两个源文件包含相同的头文件时,依然提示某些变量重复
    发表于 10-09 06:19

    工厂设备能不能工业数采?3招教你快速判断,省时又省钱!

    设备能不能采?记住这五招:看接口、问协议、查灯亮、找厂家、加传感器。大部分现代工厂设备(PLC/CNC/注塑机),甚至部分干燥机、模温机,都是能采的!别被“老设备”吓住。
    的头像 发表于 07-03 10:09 538次阅读
    工厂设备<b class='flag-5'>能不能</b>工业数采?3招教你快速判断,省时又省钱!

    cyw20829能不能使用红外线解码吗?

    cyw20829能不能使用红外线解码吗
    发表于 07-03 06:49

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循
    的头像 发表于 04-29 18:49 1735次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    labview输出不重复随机数

    大佬们能不能告知一下这张图为什么还是会输出重复的数,然后这个移位寄存器的红点也消不掉
    发表于 04-17 10:51

    STM32C031F4 FLASH存储器读写例程各位高能不能提供一个?

    STM32C031F4FLASH存储器 读写例程 各位高能不能提供一个谢谢大家
    发表于 03-13 07:37

    请问SPC5_STUDIO能不能用stellarllink进行连接?如何连接?

    SPC5_STUDIO能不能用stellarllink进行连接?如何连接?
    发表于 03-10 08:18

    stm32f103cbu6底部焊盘能不能连接到VSS?

    stm32f103cbu6底部焊盘能不能连接到VSS
    发表于 03-10 07:51

    ADS8568能不能使用单电源供电?

    ADS8568能不能使用单电源供电,即HVSS接地,HVDD接+12V,能正常工作吗?我现在用的硬件模式,采不到数据。。
    发表于 01-17 06:14

    EE-62:在C语言中访问短字内存

    电子发烧友网站提供《EE-62:在C语言中访问短字内存.pdf》资料免费下载
    发表于 01-07 14:02 0次下载
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>语言中</b>访问短字内存

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言中</b>的DSP:从<b class='flag-5'>C</b>调用汇编类成员函数

    请问ads1271能不能测量负电压?

    1.请问ads1271能不能测量负电压,现在的电路ainn接的是地,ainp接的被测量模拟量,当ainp为正的时候数值正确,当ainp为负值时数值接近于0. 2.手册里的data rate
    发表于 01-01 08:09

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

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

    ADS1292R导联能不能共用?

    现在已经实现了ADS1298测量8通道心电型号,要加上呼气阻抗的测量功能,要求这两种同时测量,所以打算再用一片ADS1292R完成呼吸测量,这样的话有些导连需要共用,问题是:导联能不能共用?如果
    发表于 12-12 08:36