条件编译指令选择哪些代码被编译,哪些代码不被编译。可以根据表达式的值或某个特定宏是否被定义来确定编译条件。
# 空指令
#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