当前位置:网站首页>一文搞懂 条件编译和预处理指令 #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined 详解
一文搞懂 条件编译和预处理指令 #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined 详解
2022-08-09 07:56:00 【Love coldplay】
本文主要介绍c语言中条件编译相关的预编译指令,包括 #define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined。
#define 定义一个预处理宏
#undef 取消宏的定义
#if 编译预处理中的条件命令,相当于C语法中的if语句
#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef 与#ifdef相反,判断某个宏是否未被定义
#elif 若#if或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else 与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif #if, #ifdef, #ifndef这些条件命令的结束标志.
defined 与#if, #elif配合使用,判断某个宏是否被定义
条件编译是根据实际定义宏(某类条件)进行代码静态编译的手段。可根据表达式的值或某个特定宏是否被定义来确定编译条件。
程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理;
条件编译指令将决定哪些代码被编译,而哪些不被编译的;
可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。
1、如果表达式为真,就编译语句段1,否则编译语句段2
#if表达式
//语句段1
#else
//语句段2
#endif
2、如果表达式1真,则编译语句段1,否则判断表达式2;如果表达式2为真,则编译语句段2,否则编译语句段3
#if表达式1
//语句段1
#elif表达式2
//语句段2
#else
//语句段3
#endif
3、如果在此之前已定义了这样的宏名,则编译语句段。
#ifdef 宏名
//语句段
#endif
4、如果在此之前没有定义这样的宏名,则编译语句段。
注意事项: 在情况3和4中 #else可以用于#ifdef和#ifndef中,但#elif不可以。对应下面的情况5 和 6
#ifndef宏名
//语句段
#endif
5、如果有定义这样的宏名,则编译语句段1,否则,编译语句段2
#ifdef宏名
//语句段1
#else
//语句段2
#endif
6、如果没有定义这样的宏名,则编译语句段1,否则,编译语句段2
#ifndef宏名
//语句段1
#else
//语句段2
#endif
下面做展示案例1
1、 宏定义了PM #ifdef PM 则执行紧接着的程序块1,否则执行#else 紧接着的程序块2
void test01()
{
float r = 100;
#ifdef PM
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
printf("面积为%f\n周长为%f\n", s, c);
#endif
}
2、宏定义了PM #ifndef PM 则不执行紧接着的程序块1,执行#else 紧接着的程序块2
void test02()
{
float r = 100;
#ifndef PM
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
PR("PW\n");
printf("面积为%f\n周长为%f\n", s, c);
#endif
}
3、#if 非零整型常量 一般常用1 则执行紧接着的程序块1,否则执行#else 紧接着的程序块2
void test03()
{
float r = 100;
#if 0 // #if 非零整型常量 一般常用1 则执行紧接着的程序块1,否则执行#else 紧接着的程序块2
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
printf("PW\n"); // 宏名除了双括号里面的内容不能替换
printf("面积为%f\n周长为%f\n", s, c);
#endif
//#undef PR
PR("我爱你\n"); //报错 “PR” : 找不到标识符
}
总代码
// 条件编译示例.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define PI 3.1415926
#define PM float c;float s; c=2*PI*r; s=PI*r*r
#define PR printf
#define PW Hello World
#include <iostream>
void test01()
{
float r = 100;
#ifdef PM
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
printf("面积为%f\n周长为%f\n", s, c);
#endif
}
void test02()
{
float r = 100;
#ifndef PM
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
PR("PW???\n");
printf("面积为%f\n周长为%f\n", s, c);
#endif
}
void test03()
{
float r = 100;
#if 0 // #if 非零整型常量 一般常用1 则执行紧接着的程序块1,否则执行#else 紧接着的程序块2
float c;
float s;
c = 2 * PI*r;
s = PI * r*r;
printf("=================\n");
#else
PM;
printf("PM宏定义\n");
printf("Hello World!\n");
printf("PW!!!\n"); // 宏名除了双括号里面的内容不能替换
printf("面积为%f\n周长为%f\n", s, c);
#endif
//#undef PR
PR("我爱你\n"); //报错 “PR” : 找不到标识符
}
int main()
{
//test01();
test02();
//test03();
system("pause");
return 0;
}
下面展示案例2
#ifdef 和 #ifndef
作用:这二者主要用于防止头文件重复包含。我们一般在.h头文件前面加上这么一段:
//防止头文件重复包含funcA.h
#ifndef FUNCA_H
#define FUNCA_H
//头文件内容
#end if
这样,如果a.h包含了funcA.h,b.h包含了a.h、funcA.h,重复包含,会出现一些type redefination之类的错误。
#if defined 等价于 #ifdef #if !defined 等价于 #ifndef
边栏推荐
- C language: reverse character order
- RestFul,会话技术,Fiddler
- 【机器学习】降维代码练习
- SA-Siam:用于实时目标跟踪的双重连体网络A Twofold Siamese Network for Real-Time Object Tracking
- 数据库索引原理
- SOLIDWORKS 2022新功能直播揭秘!速来围观!
- Oracle 限制时将空值排除
- 2019 Nanchang Internet Competition Question C, Hello 2019
- Kotlin Coroutines - Exception Handling
- BIM技术多牛逼?BIM技术在建筑工程行业的四大发展趋势
猜你喜欢
随机推荐
[STL]vector
Pytorch 训练技巧
3安装及管理程序
MYSQLWorkbench看数据库ER图
【Reprint】Deep Learning (deep learning) study notes arrangement
C语言:打印菱形
(五)、马尔科夫预测模型
2019 Nanchang Internet Competition Question C, Hello 2019
动态设置img标签图片失效问题
安全的Md5加密:两次加密(加盐)
研发分享:机器学习卡片的使用
pip安装更换镜像
String类创建的对象在JVM中的内存分配和equals与==的区别
账户和权限管理2
原生JDBC操作数据库
Luogu P1110 report statistics multiset stl good question
Unity 3D模型展示框架篇之资源打包、加载、热更(二)
EXCEL使用函数联调(find,mid,vlookup,xlookup)
环形链表问题(判环、求入口点)
BIM技术多牛逼?BIM技术在建筑工程行业的四大发展趋势