巧用C语言中的条件编译

相信接触过C语言的同学对条件编译都比较熟悉,而对于初学者来说估计都会抛出“什么是条件编译,条件编译的作用以及编写方法是怎样的”下面就为大家详细介绍C语言中的条件编译的概念和作用以及用法。

巧用C语言中的条件编译_编程语言_C语言_条件编译_课课家教育

  所谓条件编译(conditional compile),简而言之就是对一部分内容指定编译条件。我们在对条件编译语句进行排版时,需考虑以下三个重点:

  ①条件编译语句块与函数定义体之间不存在相互嵌套(主要在(.h)文件中)。

  ②条件编译语句块嵌套在函数体之外(主要在(.c)文件中)。

  ③条件编译语句嵌套在函数体内(主要在(.c)文件中)。

  条件编译指令将决定哪些代码被编译,而哪些是不被编译的。在实际情况中国我们可根据表达式的值或某个特定宏是否被定义来确定编译条件。

  下面笔者举个编写例子让大家能够更透彻的理解:

  目标:编写一个C语言程序,输出文字颜色为红色,要求在WindowsLinux下都能运行。

  思路:Windows有专有的宏_WIN32,Linux有专有的宏__linux__,利用ifelse来进行编写。

  #include<stdio.h>

  intmain(){

  if(_WIN32){

  system("color0c");

  printf("http://www.kokojia.com\\n");

  }elseif(__linux__){

  printf("\\033[22;31mhttp://www.kokojia.com\\n\\033[22;30m");

  }else{

  printf("http://www.kokojia.com\\n");

  }

  return0;

  }

  但大家仔细观察就会发现这段代码其实是有错误的,具体表现为在Windows下提示__linux__是未定义的标识符,在Linux下提示_Win32是未定义的标识符。

  接下来笔者对上面的代码进行改进,以下是修改后正确的代码:

  #include<stdio.h>

  intmain(){

  #if_WIN32

  system("color0c");

  printf("http://www.kokojia.com\\n");

  #elif__linux__

  printf("\\033[22;31mhttp://www.kokojia.com\\n\\033[22;30m");

  #else

  printf("http://www.kokojia.com\\n");

  #endif

  return0;

  }

  #if、#elif、#else和#endif都是预处理命令,整段代码的意思是:如果宏_WIN32的值为真,就保留第4、5行代码,删除第7、9行代码;如果宏__linux__的值为真,就保留第7行代码;如果所有的宏都为假,就保留第9行代码。以上这些操作都是在预处理阶段完成的,多余的代码以及所有的宏都不会参与编译,不仅保证了代码的正确性,还减小了编译后文件的体积。正如开头所说,这种能够根据不同情况编译不同代码、产生不同目标文件的机制的就是条件编译。条件编译是预处理程序的功能,不是编译器的功能。在条件编译中存在有多种形式,具体如下。

  ◎#if命令

  首先笔者先给大家介绍的是#if命令,通常#if命令的完整格式为:

  #if整型常量表达式1

  程序段1

  #elif整型常量表达式2

  程序段2

  #elif整型常量表达式3

  程序段3

  #else

  程序段4

  #endif

  它的具体意思是:如常“表达式1”的值为真(非0),就对“程序段1”进行编译,否则就计算“表达式2”,结果为真的话就对“程序段2”进行编译,为假的话就继续往下匹配,直到遇到值为真的表达式,或者遇到#else。这一点和ifelse非常类似。需要我们注意的地方是,#if命令要求判断条件为“整型常量表达式”,也就是说表达式中不能包含变量,而且结果必须是整数;而if后面的表达式没有限制,只要符合语法就行。这是#if和if的一个重要区别。另外#elif和#else也可以省略,具体如下所示:

  printf("ThisisWind#include<stdio.h>

  intmain(){

  #if_WIN32ows!\\n");

  #else

  printf("Unknownplatform!\\n");

  #endif

  #if__linux__

  printf("ThisisLinux!\\n");

  #endif

  return0;

  }

  ◎#ifdef命令

  接下来笔者为大家介绍的是#ifdef命令,通常#ifdef命令的格式为:

  #ifdef宏名

  程序段1

  #else

  程序段2

  #endif

  它的具体意思是:如果当前的宏已被定义过,则对“程序段1”进行编译,否则对“程序段2”进行编译。另外我们也可以省略#else:

  #ifdef宏名

  程序段

  #endif

  需要我们注意的地方是,在VS/VC中有两种编译模式,debug和Release,而我们通常使用Debug模式,因为这样便于程序的调试。相反最终发布的程序,我们要使用Release模式,这样编译器会进行很多优化,提高程序运行效率,删除冗余信息。为了能够清楚地看到当前程序的编译模式,我们不妨在程序中增加提示,具体大家可以观察下面的代码例子:

  #include<stdio.h>

  #include<stdlib.h>

  intmain(){

  #ifdef_DEBUG

  printf("正在使用Debug模式编译程序...\\n");

  #else

  printf("正在使用Release模式编译程序...\\n");

  #endif

  system("pause");

  return0;

  }

  当以Debug模式编译程序时,宏_DEBUG会被定义,预处器会保留第5行代码,删除第7行代码。反之会删除第5行,保留第7行。

  ◎#ifndef命令

  最后笔者给大家介绍#ifndef命令,通常#ifndef命令的格式为:

  #ifndef宏名

  程序段1

  #else

  程序段2

  #endif

  与#ifdef相比,仅仅是将#ifdef改为了#ifndef。它的意思是:如果当前的宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译,这与#ifdef的功能正好相反。

  ◎三者的区别

  #if后面跟的是“整型常量表达式”,而#ifdef和#ifndef后面跟的只能是一个宏名,不能是其他的。比如下面的形式只能用于#if:

  #include<stdio.h>

  #defineNUM10

  intmain(){

  #ifNUM==10||NUM==20

  printf("NUM:%d\\n",NUM);

  #else

  printf("NUMError\\n");

  #endif

  return0;

  }

  输出结果:

  NUM:10

  再比如两个宏都存在时编译代码A,否则编译代码B:

  #include<stdio.h>

  #defineNUM110

  #defineNUM220

  intmain(){

  #if(definedNUM1&&definedNUM2)

  //代码A

  printf("NUM1:%d,NUM2:%d\\n",NUM1,NUM2);

  #else

  //代码B

  printf("Error\\n");

  #endif

  return0;

  }

  输出结果:

  NUM1:10,NUM2:20

  #ifdef可以认为是#ifdefined的缩写。


  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值