首页 > 其他分享 >C语言 ——— 条件编译指令实际用途

C语言 ——— 条件编译指令实际用途

时间:2024-09-13 23:49:45浏览次数:13  
标签:文件 头文件 包含 C语言 查找 编译 指令 ifndef

目录

前言

头文件被包含的方式

嵌套文件包含

使用条件编译指令规避头文件多次包含

 还有一个编译指令,同样能做到以上功能


 

前言

条件编译指令多用于对头文件的定义和判断以及删除


头文件被包含的方式

本地文件包含(也就是自己创建的头文件):

#include "stdio.h"

本地文件包含的查找策略:
会现在源文件所在的目录下查找,如果该头文件没有查找到,编译器就会像查找库函数的头文件一样在标准位置查找该头文件,如果再找不到就会提示编译错误

库文件包含:

#include<stdio.h>

库文件包含的查找策略:

查找库里面的头文件时,编译器会直接去标准路径下查找,如果找不到就会提示编译错误

结论:

库里面的头文件也可以使用 "" 的形式包含,但这样的话查找头文件的效率就低了,且这样也不容易区分是库文件还是本地文件了,所以本地文件使用 "" 的形式包含,库文件使用 <> 的形式包含


嵌套文件包含

在一个工程项目里面,可能 .h 文件包含了其他 .h 文件,也有可能互相包含,这样的结果就会导致同一份 .h 文件出现多次,这样就造成了文件内容的重复

解决以上文件就需要使用到条件编译指令,来判断和删除头文件


使用条件编译指令规避头文件多次包含

代码演示:

#ifndef __TEST_H_
#define __TEST_H_

int Add(int x, int y);

#endif

以上代码的头文件为:#include "test.h"

代码解析:
#ifndef 编译指令的功能是:当后面的表达式为假的时候(也就是没有定义时)就执行中间的代码,否则就不执行,且头文件为 test.h ,那么要使用 #ifndef 来判断的话,最好是将 test.h 写成 __TEST_H_ 的形式,便于理解

当其他头文件包含此 test.h 头文件时,也就是当程序第一次进入此头文件的时候,程序肯定没有包含过此头文件,所以 #ifndef 判断就会为假,#ifndef 中的代码就会执行,且 #define 就会定 义 __TEST_H_ 这个头文件

所以当第二次以后其他头文件包含此文件时,#ifndef 判断就会为真,#ifndef 中的代码就不会再执行

这样就规避了同一份 .h 文件出现多次,且文件内容重复的情况


 还有一个编译指令,同样能做到以上功能

代码演示:

#pragma once

只要将这条指令放在头文件的最开始位置,也同样能实现以上功能

标签:文件,头文件,包含,C语言,查找,编译,指令,ifndef
From: https://blog.csdn.net/weixin_55341642/article/details/142129917

相关文章

  • 基础数据结构-二分变形C语言实现
    基础二分下面是一个最基础的二分搜索代码,从一个数组(数据从小到大排)中找出某元素。#include<stdio.h>//函数声明intbinarySearch(intarr[],intleft,intright,intx);intmain(){//测试数据intarr[]={2,3,4,10,40};intn=sizeof(arr)......
  • 文本溢出时,悬浮显示,使用自定义指令
    单行溢出代码overflow:hidden;text-overflow:ellipsis;white-space:nowrap;多行溢出代码overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;word-break:break-all;-webkit-box-o......
  • Centos7编译安装LNMP和搭建WordPress网站
    步骤1:安装依赖包 yum-yinstallgcc-c++&&yuminstall-ypcrepcre-devel&&yuminstall-yzlibzlib-devel&&yuminstall-yopensslopenssl-devel步骤2:编译安装nginx1.下载nginxwgethttp://nginx.org/download/nginx-1.26.2.tar.gz2.解压......
  • AnolisOS-7.9编译升级安装 OpenSSH_9.8p1+OpenSSL 3.3.0+zlib1.3.1
     实验镜像AnolisOS-7.9-QU1-x86_64-dvd.iso安装过程内核选择3.x #安装必备和常用软件包#安装相关的依赖项,如有遗漏再次安装yuminstall-y perl-IPC-Cmdvimmakegccwgettarlrzsznet-tools #安装zlib./configure--prefix=/usr/local/zlibmake&&makei......
  • ubuntu-22.04.4编译升级安装 OpenSSH_9.8p1+OpenSSL 3.3.2+zlib1.3.1
     实验镜像ubuntu-22.04.4-live-server-amd64.iso#安装必备和常用软件包#安装相关的依赖项,如有遗漏再次安装aptinstall-y libz-devvimgccwgettarlrzsznanomakenet-tools #安装zlib./configure--prefix=/usr/local/zlibmake&&makeinstall #安装......
  • C语言 12 函数
    其实函数在一开始就在使用了://这就是定义函数intmain(){...}程序的入口点就是main函数,只需要将程序代码编写到主函数中就可以运行了,不过这个函数只是由我们来定义,而不是我们来调用。当然,除了主函数之外,一直在使用的printf也是一个函数,不过这个函数是标准库中已经......
  • 一分钟在线编译定制专属固件: openwrt.ai
    https://github.com/kiddin9/Kwrt?tab=readme-ov-file  KwrtPublic Watch96Fork 3k Star 7.4k kiddin9/Kwrt   master1 Branch0 TagstAddfileAddfile CodeFoldersandfilesName  ......
  • [C语言] 14--编译器、宏定义和头文件
    1.编译器概念:编译器是一个用来帮助我们把原码.c翻译成计算机能够直接识别的二进制编码。使用不同的编译器可以翻译出来不同机器的二进制编码。gcc编译器:gcchello.c-ohellogcc-->C语言编译器hello.c-->需要编译的原码-o-->指定输出文件名hello-->可执行文件的......
  • C语言学习--重难点易错点
    define易错;只是全局替换在输入数据时候,遇到以下情况时,认为该数据结束①遇空格,或按回车,或跳格键;②指定宽度结束,如%3d;③遇非法输入类型转换inti=5;floatf=i/2;df:floatf=(float)i/2;注意上面的区别C语言只有整型,实型(浮点精度值),字符型,无逻辑型——bool......
  • C语言 11 字符串
    前面学习了数组,而对于字符类型的数组,比较特殊,它实际上可以作为一个字符串(String)表示,字符串就是一个或多个字符的序列,比如在一开始认识的"HelloWorld",像这样的多个字符形成的一连串数据,就是一个字符串,而printf函数接受的第一个参数也是字符串。在C语言中并没有直接提供存储字符......