• C++基础系列二:预处理器


    (1)常见预处理器指令集

    C++继承了C的非常精细的预处理器,以高度受限的方式使用预处理器。预处理器主要的指令及功能如下表:

    指令 功能
    # 空指令,无任何效果
    #include 包含一个源代码文件,把源文件中的#include扩展为文件正文,即把包含.h的文件找到并扩展到#include所在处
    #define 定义宏
    #undef 取消已定义的宏
    #if 条件编译指令,如果为真,则编译下面的代码
    #ifdef 条件编译指令,如果宏已经定义,则编译下面的代码
    #ifndef 条件编译指令,如果宏没有定义,则编译下面的代码
    #elif 条件编译指令。如果之前的if不为真,当前条件为真,则编译下面代码
    #endif 结束一个#if...#else条件编译块
    #error 停止编译并显示错误信息

    下面简要介绍预处理器使用的比较多的几个地方:

    (2)头文件保护符:#ifndef ,#define ,#endif

    头文件保护符:#ifndef ,#define ,#endif,是为了避免某个头文件被多重包含。如类Person中包含了头文件string,而使用Person类的程序中也许并不确定Person中是否已经包含string,于是它便再次#include<string>,这样一来,string就被包含了两次,为了保证多次包含同一头文件不会引起该头文件定义的类和对象被多次定义,就需要采用头文件保护符。

    #define表示接受一个名字并定义该名字为预处理器变量;#ifndef指示检测指定的预处理器变量是否未定义,如果未定义,那么跟在其后的所有指示都被处理,直到出现#endif。

    (3)#include <fileName.h>和#include "fileName.h"

    对于#include <fileName.h>,编译器先从标准库路径开始搜索fileName.h,然后从本地目录搜索,用于系统文件调用较快;

    而#include "fileName.h",编译器先从用户的当前工作路径中开始搜索fileName.h,然后寻找系统路径,用于自定义文件较快。

    (4)使用预处理器进行调试

    如果程序员希望程序所包含的调试代码仅在开发过程中执行,当应用程序已经完成并且准备提交时,就将调试代码关闭,那么可以通过使用NDEBUG预处理变量实现有条件的调试代码:

    1 void main()
    2 {
    3 #ifndef NDEBUG
    4     cerr<<"starting main..."<<endl;
    5 #endif
    6 }

    上面的代码中,如果NDEBUG未定义,那么第4行就会执行。开发完成后,可通过定义预处理变量NDEBUG来删除这些调试语句。大多数编译器都提供NDEBUG的命令行选型:
    $ cc -DNDEBUG main.c

    上述命令等效于在main.c的开头提供#define NDEBUG的预处理命令。

  • 相关阅读:
    SDN课程阅读作业(2)
    2019 SDN上机第4次作业
    第11组 Alpha事后诸葛亮
    第11组 Alpha冲刺(6/6)
    第11组 Alpha冲刺(5/6)
    2019 SDN上机第3次作业
    2019 SDN阅读作业
    第11组 Alpha冲刺(4/6)
    第11组 Alpha冲刺(3/6)
    模式识别和机器学习、数据挖掘的区别与联系(转发)
  • 原文地址:https://www.cnblogs.com/sophia-yun/p/3153100.html
Copyright © 2020-2023  润新知