关闭

C++预处理详解

143人阅读 评论(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网站的观点或立场

Linux C 预处理详解

1.预处理程序 按照ANSI标准的定义,预处理程序应该处理以下指令: #if #ifdef #ifndef #else #elif #endif #define #undef #line #error...
  • zqixiao_09
  • zqixiao_09
  • 2015-12-23 13:07
  • 1264

C++ 高级篇(五)—— 预处理指令

预处理指令是我们写在程序代码中的给预处理器(preprocessor)的 命令,而不是程序本身的语句。预处理器在我们编译一个C++程序时由编译器自动执行,它负责控制对程序代码的第一次验证和消化。 所有...
  • zqixiao_09
  • zqixiao_09
  • 2016-05-23 19:11
  • 2123

C语言内存分配 详解(附图)

这段时间做项目遇到一个问题,就是创建一个结构体指针,创建的时候全都置零初始化,然后通过指针在使用的地方进行赋值,但是老是会出现对A成员赋的值存放到B成员当中去了的情况。后来老大帮忙解决,发现是结构体内...
  • kaisuihu
  • kaisuihu
  • 2013-10-06 15:52
  • 1326

C++ #pragma 预处理指令详解

  • 2015-03-09 09:26
  • 107KB
  • 下载

c/c++预处理过程详解(二)之条件编译及预定义的宏

未经博主同意不得私自转载!不准各种形式的粘贴复制本文及盗图! 首先对于上篇文章中宏定义的补充: (1)#define NAME"zhangyuncong" 程序中有"NAME"则,它会不会被替换呢?...
  • qq_26816591
  • qq_26816591
  • 2016-08-20 15:36
  • 354

C/C++预处理指令#pragma详解

在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的...
  • neo_liukun
  • neo_liukun
  • 2011-07-20 14:05
  • 216

C/C++的预处理指令详解

转载http://www.cnblogs.com/zi-xing/p/4550246.html 本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果#include包含...
  • cyz9638527410
  • cyz9638527410
  • 2017-06-11 16:27
  • 191

c/c++预处理过程详解(一)之文件包含、宏定义

未经博主同意不得私自转载!不准各种形式的粘贴复制本文及盗图! 其实本文原本是打算研究一下#define的,后来发现预处理是个不可避免的问题。 在讲#define 前需要讲讲 # # 涉及到...
  • qq_26816591
  • qq_26816591
  • 2016-08-20 15:23
  • 657

C++ - 使用 编译器常量 代替 预处理常量 详解

使用编译器常量代替预处理常量 详解   本文地址: http://blog.csdn.net/caroline_wendy/article/details/15809051 对于单纯常量, 可以使用c...
  • u012515223
  • u012515223
  • 2013-11-13 09:41
  • 2264

C++编译预处理

  • 2014-12-16 17:05
  • 212KB
  • 下载
    个人资料
    • 访问:13311次
    • 积分:280
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:15篇
    • 译文:0篇
    • 评论:0条
    文章分类