关闭

练习

57人阅读 评论(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
查看评论

vim练习

学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活感觉良好觉得更好,更强,更快使用VIM的超能力 当你走完这篇文章,你会成为一个vim的 superstar。 在开始学习...
  • baiquan17
  • baiquan17
  • 2017-04-07 11:57
  • 430

linux 各命令字练习

linux 各命令字练习
  • lile777
  • lile777
  • 2016-09-14 17:48
  • 1953

css3 html5 3D动画练习

New Document div{ margin-bottom:10px; width:200px; height:100px; } @keyframes myfirst { from {background: red;} to {background: yellow;} } @-moz-k...
  • zhaoqingkaitt
  • zhaoqingkaitt
  • 2015-01-10 10:46
  • 1138

练习学习Linq和Lambda

1、 查询Student表中的所有记录的Sname、Ssex和Class列。 select sname,ssex,class from student Linq:     from s in Students   ...
  • make1828
  • make1828
  • 2014-07-23 14:08
  • 664

Android基础练习

1.自定义Toast 步骤,首先需要添加一个自定义的toast布局,然后通过构造方法实例化一个Toast对象即可 public void onToast(View view) { //1.加载自定义布局 LayoutInflater layoutInflater ...
  • u011337769
  • u011337769
  • 2017-06-08 19:49
  • 311

oracle百例训练

 Oracle系列《一》:简单SQL与单行函数     使用s   cott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下 emp员工表(empno员工号/ename员工姓名/job工作/mg...
  • u010098159
  • u010098159
  • 2016-03-24 18:23
  • 1260

HTML练习-1

http://7xrp04.com1.z0.glb.clouddn.com/task_1_1_1.jpg 代码:   第一部分的          p{ margin: 0px; padding: 0px; } 网站一级...
  • itzhengmaolin
  • itzhengmaolin
  • 2016-08-01 19:44
  • 350

Java Web学习(8):阶段小项目练习

一输出圆的信息        项目描述:编写一个JSP页面中声明圆的半径和计算方法,然后使用表达式,实现输出圆的半径,直径,面积和 周长的相关信息。        JSP实现代码: <%@ page lan...
  • erlian1992
  • erlian1992
  • 2016-07-12 13:39
  • 3102

一起学WEB(八) 一个网页练习(一)

通过一个网页练习,逐步建立漂亮的网站(一)
  • FebWaltz
  • FebWaltz
  • 2017-02-08 09:23
  • 261

h5学习笔记: css布局案例练习

今天练习一下css相关的布局,没有写交互内容。在css布局中,发现也不少不熟悉的地方。只是没有形成概念,其次对一些用法比较模糊。日后需要加强一下这些。对平衡的两个div应该如何处理,还要继续想想办法。 交互那些还要看看jq是如何使用。还有渲染列应该用数据驱动处理。<!DOCTYPE html...
  • hero82748274
  • hero82748274
  • 2016-08-22 21:55
  • 2347
    个人资料
    • 访问:12751次
    • 积分:1727
    • 等级:
    • 排名:千里之外
    • 原创:169篇
    • 转载:7篇
    • 译文:0篇
    • 评论:0条