首页 > 其他分享 >总结:C语言条件编译

总结:C语言条件编译

时间:2023-05-18 17:26:06浏览次数:48  
标签:总结 E5% BC% E7% C语言 编译 E4% 程序段

条件编译指令选择哪些代码被编译,哪些代码不被编译。可以根据表达式的值或某个特定宏是否被定义来确定编译条件。

#           空指令
#include    包含一个源代码文件
#define     定义宏
#undef      取消已定义的宏
#error      停止编译并显示错误信息

#if,如果给定条件为真,则编译下面代码
#ifdef,如果宏已经定义,则编译下面代码
#ifndef,如果宏没有定义,则编译下面代码
#endif,终止#if指令
#elif,综合#else和#if指令的作用,如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#else,用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码
defined(), 判断标识符是否定义过,#if defined 等价于 #ifdef,#if !defined 等价于 #ifndef。
条件编译的用途

1,防止头文件重复包含

避免同一个头文件被多次包含、重复引用
#ifndef _HEADERNAME_H_
#define _HEADERNAME_H_

#include<headname.h>
或
#include"headname.h"

#endif
#include<headname.h>, 预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件;#include"headname.h",预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,若找不到,再搜索编译器自带的头文件。

2,编译部分代码

组合方式1如果宏名称已经定义,则对程序段 1 进行编译;否则对程序段 2 进行编译。
#ifdef 宏名称
/*程序段1*/
#else
/*程序段2*/
#endif

组合方式2#ifndef 指令的含义正好与 #ifdef 指令相反,因此它表示如果宏名称未被定义,则对程序段 1 进行编译,否则对程序段 2 进行编译。
#ifndef 宏名称
/*程序段1*/
#else
/*程序段2*/
#endif

组合方式3如果表达式1的值为真(非 0),则对程序段1进行编译,如果表达式2的值为真,则程序段2进行编译,否则对程序段3进行编译。
#if 表达式1
/*程序段1*/
#elif 表达式2
/*程序段20
#else
/*程序段2*/
#endif

组合方式4如果未定义宏1,且已定义宏2,则对程序段进行编译
#if !defined(宏1)&&defined(宏2)
/*程序段*/
#endif



资料引用https://blog.csdn.net/21aspnet/article/details/6737612 https://zhuanlan.zhihu.com/p/76642186#:~:text=%E5%9C%A8,C%20%E8%AF%AD%E8%A8%80%E4%B8%AD%EF%BC%8C%E6%9D%A1%E4%BB%B6%E7%BC%96%E8%AF%91%E6%8C%87%E4%BB%A4%E5%8F%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E6%BA%90%E4%BB%A3%E7%A0%81%E7%9A%84%E9%83%A8%E5%88%86%E7%BC%96%E8%AF%91%E5%8A%9F%E8%83%BD%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%A0%B9%E6%8D%AE%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%9A%84%E5%80%BC%E6%88%96%E8%80%85%E6%9F%90%E4%B8%AA%E7%89%B9%E5%AE%9A%E7%9A%84%E5%AE%8F%E6%9D%A5%E7%A1%AE%E5%AE%9A%E7%BC%96%E8%AF%91%E6%9D%A1%E4%BB%B6%EF%BC%8C%E4%BB%A5%E5%86%B3%E5%AE%9A%E7%BC%96%E8%AF%91%E5%93%AA%E4%BA%9B%E4%BB%A3%E7%A0%81%EF%BC%8C%E4%B8%8D%E7%BC%96%E8%AF%91%E5%93%AA%E4%BA%9B%E3%80%82

标签:总结,E5%,BC%,E7%,C语言,编译,E4%,程序段
From: https://www.cnblogs.com/bog-box/p/17412539.html

相关文章

  • 编译chromium浏览器-win64版
    文档说明:只是记录关键点2023-05-18因为已经熟练实现linux版chromium,每月自动构建一版。在此基础上尝试构建win64版本快速构建的办法:购买抢占式云服务器,把配置(比如:32核CPU)买高一点,几个小时据构建完毕了,主要耗时地方是:下载资源准备工具#用于解压https://7-zip......
  • muduo库总结
    第5章高效的多线程日志muduo没有用标准库中的iostream,而是自己写的LogStreamclass,这主要是出于性能原因(§11.6.6)。为什么不通过网络写日志信息:无法判断网络问题、可能使发送日志的一方内存爆掉、消耗带宽日志文件的滚动:达到一定时间或文件达到一定大小后,会新建日志文件。创......
  • 开发经验总结
    1、在多端小程序融合一端的情况下,login操作不适宜放在app.js里边,会导致多端用户互相影响的情况。  正确的做法是,在有可能成为普通用户入口页的地方,做login操作。  非普通用户端用户,连续进入非普通用户入口,可根据缓存通过服务器验证登录态的方式,实现自动登录,不会受到普......
  • MinGW32编译ffmpeg+libsrt
    MinGW编译带srt库的ffmpeg前言MinGW安装CMAKE安装VisualStudio2017安装支持windows的线程库SRT库的编译openssl的安装SRT编译MinGW下的SDL和opensslopensslSDLffmpeg编译PKG-CONFIG配置ffmpeg前言国内关于SRT协议的资料,几乎为0,没什么人用srt协议去编译过ffmpeg,而且这东西在Wind......
  • win10定时开关机(很多地方总结的定时开机不生效),要用主板bios设置才可以
    1.定时关机(可以使用windows中计划任务)1.此电脑右键-->管理-->系统工具-->任务计划程序库-->右侧创建基本任务2.名称:定时关机,触发器:每天,开始时间2023/05/1817:30:00,启动程序:浏览选择C:\Windows\System32\shutdown.exe,参数:-s 2.定时开机(系统中设置开机,肯定不行。......
  • c++ ffmpeg 推送rtsp码_编译ffmpeg以获得极佳性能
    背景Gemfield最近尝试使用python封装的ffmpeg库(PyAV)来进行mp4文件、rtmp协议及其它协议的decode,具体来说就是将mp4文件(或者rtmp协议的数据,下同)进行demux并逐帧decode。然而在这期间发现了一些decode的性能问题。这些问题概括起来就是2点:python封装的ffmpeg是否能够利用到多核CPU的......
  • AT_abc_260_f 总结
    题目:AT_abc_260_f链接:洛谷,AT,vjudge题意有一个\(S+T\)个点\(m\)条边的简单无向图\(G\)。点集\(V1\)包括点\(1-S\),点集\(V2\)包括点\(S+1-S+T\),同点集的点没有边相连,请输出一个按任意顺序输出任意长度为\(4\)的简单环。数据范围:\(2\leS\le3\times......
  • 近期工作总结#6
    遇到一个很尴尬的问题network里面有返回值,但是打印不出来,打印出来里面的值就是空的,然后经过询问排查才知道,console的打印的值存在内存里,但是如果你的代码有处理之后,在打印里面就会变成处理后的值,当你点开的时候,这个值在内存里放着,你点击的时候才会调用它,但是此时的值以及被处理过......
  • 使用buildx在x86机器上面编译arm64架构的Docker镜像
    buildx多架构编译安装docker下载docker下载buildx安装架构支持dockerrun--privileged--rmtonistiigi/binfmt--installall创建一个自己的空间buildxcreate--use--namemybuilder检查支持的架构buildxinspectmybuilder--bootstrapNodes:Name:mybu......
  • 编程打卡:C语言程序设计
    classmiband(Peripheral):_send_rnd_cmd=struct.pack('<2s',b'\x02\x00')_send_enc_key=struct.pack('<2s',b'\x03\x00')def__init__(self,mac_address,key=None,timeout=0.5,debug=False):......