C语言杂谈01

阅读: 评论:0

C语言杂谈01

C语言杂谈01

架构图

前言

由于地区翻译关係,有些书籍将macro翻译成"巨集",有些翻译成"宏",为了避免混淆(我自己),所以文章内容会以英文名macro来代替中文译名

甚麽是条件编译

条件编译就是根据已经定义的macro进行选择性判断的语句,它会在compiler进行编译前完成,主要由预处理器负责

预处理器会将条件编译指令的结果告诉compiler,让他去编译指定区段的程式码。条件编译指令可能会出现在程式的任何一个位置,端看使用方法,例如下方这个简单的程式范例就含有条件编译:

#include <stdio.h>/*若a没有被定义就定义它*/
#ifndef a
#define a 1
#endifint main(){#if (a == 1)printf("a == 1n");#elseprintf("a != 1n");#endifreturn 0;
}

和一般的条件语句不同的是,条件编译在compile之前就已经决定,相反的,正常的条件语句(if, else if, else…)需要我们在执行时(run time)才能进行判断

也就是说条件编译语句可以让compiler知道那些程式码区段需要编译,那些可以直接捨去;而正常的条件语句因为需要在执行时依照变数值去判断执行区块,所以无论如何整个逻辑区块都会被全部编译

下图我们看到一个.c档被编译成可执行档的过程,绿色区块就是条件编译主要涉及部分。条件编译有点超前部署的味道,它会决定谁会被包含、编译、忽略,它不被编译器编译,想当然也不属于C/C++范畴

条件编译种类

#if, #elif, #defined

#if, #elif利用后方的常数表达式(constant-expression)来判断程式码区段是否需要被包含

例如下面简单的程式码片段,因为test被定义成1,这个条件恰好吻合第一个区段,所以会编译并执行#if#else之间区段

#include <stdio.h>#define test 1int main(){#if (test == 1)printf("Macro ");#elseprintf("Macro test is ");#endif
}

输出结果:

Macro 

#if后的常数表达式可以使用一元运算子进行判断,也可以使用逻辑运算子结合多个判断式。当判断条件超过两组时可以使用#elif, #else,和一般的if-else if-else语句没什麽分别

#include <stdio.h>#define test1 10
#define test2 1int main(){#if (test1 > 8) && (test1 < 15) && (test2 > 0)printf("Macro test meet the requirement");#elif(test1 > 15)printf("Macro test meet the requirement, but way too big");#elseprintf("Macro test doesn't meet the requirement");#endif
}

输出结果:

Macro test meet the requirement

切记#if后方的判断式要加上小括号()

#if还可以加上条件编译语句defined(),它用来判断一个macro是否被定义。例如我们把上面的程式码稍微改写一下:

#include <stdio.h>#define test1 10
// #define test2 1int main(){#if (test1 > 8) && (test1 < 15) && defined(test2)printf("Macro test meet the requirement");#elif(test1 > 15)printf("Macro test meet the requirement, but way too big");#elseprintf("Macro test doesn't meet the requirement");#endif
}

输出结果:

Macro test doesn't meet the requirement

由于test2被我们註解掉,所以实际上它没有被定义,所以最后输出结果没能满足#if#elif条件

一些常见问题
使用#if#defined的时机其实有点不同,前者单独使用必须搭配表达式,对macro的进行判断;后者仅用来判断macro是否被定义

假设我们想用#if来代替#defined判断一个test2是否被定义:

#include <stdio.h>#define test1 1
#define test2 2int main(){#if defined(test1) && (test2)printf("successn");#elseprintf(</

本文发布于:2024-02-04 22:54:42,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170718240660476.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:杂谈   语言
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23