关闭

预处理

127人阅读 评论(0) 收藏 举报

预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作。说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译。这样做的好处是,经过处理后的代码,将会变的很精短。

   关于预处理命令中的文件包含(#include),宏定义(#define),书上已经有了详细的说明,在这里就不详述了。这里主要是对条件编译(#ifdef,#else,#endif,#if等)进行说明。以下分3种情况:
  1:情况1:
  #ifdef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
   这表明如果标识符_XXXX已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
  例: 
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有过定义啦!:) \n");
  #else
   printf("之前NUM没有过定义!:( \n");
  #endif
  }
   如果程序开头有#define NUM这行,即NUM有定义,碰到下面#ifdef NUM的时候,当然执行第一个printf。否则第二个printf将被执行。
   我认为,用这种,可以很方便的开启/关闭整个程序的某项特定功能。
  2:情况2: 
  #ifndef _XXXX 
  ...程序段1... 
  #else 
  ...程序段2... 
  #endif
   这里使用了#ifndef,表示的是if not def。当然是和#ifdef相反的状况(如果没有定义了标识符_XXXX,那么执行程序段1,否则执行程序段2)。例子就不举了。
  3:情况3:
  #if 常量 
  ...程序段1...
  #else
  ...程序段2...
  #endif 
   这里表示,如果常量为真(非0,随便什么数字,只要不是0),就执行程序段1,否则执行程序段2。

   我认为,这种方法可以将测试代码加进来。当需要开启测试的时候,只要将常量变1就好了。而不要测试的时候,只要将常量变0。

我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:

  1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。

  在程序首部定义#ifdef HNLD:

  #ifdef HNLD

  #include"n166_hn.c"

  #endif

  如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。

  2.在每一个子程序前加上标记,以便追踪程序的运行。

  #ifdef DEBUG

  printf(" Now is in hunan !");

  #endif

  3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:

  #ifndef TEST

  i=dial(); 

  //程序调试运行时绕过此语句

  #else 

  i=0;

  #endif

  调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

gcc编译背后(第一部分:预处理和编译)

平时在Linux下写代码,直接用"gcc -o out in.c"就把代码编译好了,但是这后面到底做了什么事情呢?如果学习过编译原理则不难理解,一般高级语言程序编译的过程莫过于:预处理、编译、汇编、链...
  • shanzhizi
  • shanzhizi
  • 2013-07-31 16:56
  • 1245

人脸识别《一》opencv人脸识别之预处理

人脸识别对光线条件变化,
  • u011100984
  • u011100984
  • 2014-08-04 12:37
  • 5525

小白自总结【数据预处理】英文数据预处理

2.excel下→小写 3.去掉停顿词 4、5.只保留字母 6.去多余空格、去空行 7.补充——词干化
  • YWP_2016
  • YWP_2016
  • 2017-02-16 10:48
  • 1194

【java】对数据库操作的那些事(包括数据库中的预处理)

一、连接问题 前面刚介绍了怎么连接数据库,也写了相应的模板,但是它的可维护性非常差,那么怎么解决这个问题呢? 首先写一个配置文件jdbc.properties ## MySQL driver=com....
  • u011479875
  • u011479875
  • 2016-03-28 10:39
  • 1688

图像数据预处理(上)

概要 数据预处理在众多深度学习算法中都起着重要作用,实际情况中,将数据做归一化和白化处理后,很多算法能够发挥最佳效果。然而除非对这些算法有丰富的使用经验,否则预处理的精确参数并非显而易见。在本页...
  • u010555688
  • u010555688
  • 2014-04-23 11:22
  • 2927

数据分析之数据预处理

数据预处理步骤及方法 1、缺失值处理 1.1、造成缺失值原因 缺失值处理原则:使用最可能的值代替缺失值,使缺失值与其他数值之间的关系保持最大。 缺失值处理的方法很多,比如删除记录、均值填充、中...
  • qq_33323162
  • qq_33323162
  • 2017-03-06 18:01
  • 485

人脸识别---人脸图像预处理

Abstrcat—人脸图像预处理是为了去除光照对人脸影响。通常我们采用直方图均衡化对人脸图像进行处理。下面介绍一个方法对人脸进行预处理,由于没有找到相关文献的介绍,现在只能给出公式以及该方法与直方图均...
  • hlx371240
  • hlx371240
  • 2015-11-11 11:03
  • 6423

C++_3种预处理功能

1.文件包含#include 作用:把指定的源文件或头文件的全部内容包含到当前文件中。 形式1:#include,直接按系统标准方式检索文件目录。 形式2:#include"文件名",在当前的源...
  • GSH_Hello_World
  • GSH_Hello_World
  • 2016-10-16 22:28
  • 529

图像预处理技术一

预处理的意义场景图像有着截然不同的成像特性如分辨率低、大小不一、光照不均等。这些特性影响着文本定位、词图像分割到字符识别等各个过程。在将场景条件下的文本图像输入到各个模块前,对图像进行必要的预处理,对...
  • H2008066215019910120
  • H2008066215019910120
  • 2015-06-17 09:42
  • 9737

Java数据预处理

这里介绍oracle数据库中BLOB类型字段内容读取为ZIP格式文件,并且进行解压缩和对解压后文件进行处理,代码如下:package readele;import java.io.BufferedIn...
  • baidu_15113429
  • baidu_15113429
  • 2017-05-25 09:21
  • 387
    个人资料
    • 访问:29484次
    • 积分:2165
    • 等级:
    • 排名:千里之外
    • 原创:198篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    最新评论