zoukankan      html  css  js  c++  java
  • C08 C语言预处理命令

    目录

    • 宏定义
    • 文件包含
    • 条件编译


    预处理命令

    C语言的预处理:在编译之前进行的处理,不进行编译。

    C语言的预处理功能有:

    1. 宏定义
    2. 文件包含
    3. 条件编译

    预处理命令以符号“#”开头。、

    宏定义

    不带参数的宏定义

    宏定义又称为宏代换、宏替换,简称“宏”。
    格式:

    #define  标识符   文本
    

    其中的标识符就是符号常量,也称为“宏名”。

    预处理(预编译)工作也称为宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)。
    例:

    #define  PI  3.1415926
    

    把程序中全部的标识符PI换成3.1415926

    说明:
    (1)宏名一般用大写。
    (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义。
    (3)可以用#undef命令终止宏定义的作用域。
    (4)宏定义可以嵌套。

    带参数的宏

    常规带参数的宏

    除了一般的字符串替换,还要做参数代换。

    格式:

    #define  宏名(参数表)  文本
    

    例如:

    #define  S(a,b)   a*b

    例如执行:area=S(3,2)。

    第一步被换为area=a*b。

    第二步被换为area=3*2。

    类似于函数调用,有一个形参和实参结合的过程。

    宏参数中表达式的问题

    (1)实参如果是表达式容易出问题

    #define   S(r)   r*r
    

    例如执行:area=S(a+b)。

    第一步换为:area=r*r。

    第二步被换为area=a+b*a+b。

    编程意图实际为:area=(a+b)*(a+b)。

    因此:正确的宏定义是

    #define  S(r)  ((r)*(r))
    

    因此需要注意:  

    1. 宏名和参数的括号间不能有空格。
    2. 宏替换只作替换,不做计算,不做表达式求解。
    3. 函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。
    4. 宏的形参实参结合不存在类型,也没有类型转换。
    5. 宏展开使源程序变长,函数调用不会。
    6. 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。

    文件包含

    作用:一个文件包含另一个文件的内容。

    格式:

    #include  "文件名"
    

    #include <文件名>
    

    文件包含注意:

    1. 编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
    2. 编译以后只得到一个目标文件.obj。
    3. 被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。
    4. 修改头文件后所有包含该文件的文件都要重新编译。

    头文件的内容除了函数原型和宏定义外,还可定义结构体、全局变量。头文件注意要点:

    1. 一个#include命令指定一个头文件。
    2. 文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行。
    3. 包含可以嵌套。
    4. <文件名>称为标准方式,系统到头文件目录查找文件。
    5. "文件名"则先在当前目录查找,而后到头文件目录查找。
    6. 被包含文件中的静态全局变量不用在包含文件中声明。

    示例:

    使用文件包含,不需要再本文件中使用extern声明被包含进来的全局变量和函数。

    条件编译


    有些语句希望在条件满足时才编译。
    格式一:

    #ifdef 标识符
    程序段1
    #else
    程序段2
    #endif
    

    #ifdef
    程序段1
    #endif
    

    当标识符已经定义时,程序段1才参加编译。

    格式二

    #ifndef 标识符
    #define 标识1
    程序段1
    #endif
    

    如果标识符没有被定义,则重定义标识1,且执行程序段1。

    格式三

    #if 表达式1
    程序段1
    #elif 表达式2
    程序段2
    ……
    #elif 表达式n
    程序段n
    #else
    程序段n+1
    #endif
    

    当表达式1成立时,编译程序段1,当不成立时,编译程序段2。

    使用条件编译优点:可以使目标程序变小,运行时间变短。

  • 相关阅读:
    VC++6.0调用外部dll
    VC++6.0配置Opencv
    Qt 解决中文乱码问题
    Qt Widget控件设置布局后,内部控件大小发生变化
    QtDesigner 控件自适应窗体的方法
    QtSoap调用WebService服务
    QLabel自定义类实现点击效果以及鼠标掠过字体的颜色变化效果
    VS2017中工具箱控件是灰色(不可用)解决方法
    OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:uildmaster_winpack-build-win64-vc15opencvmoduleshighguisrcwindow.cpp, line 356
    OpenCV之错误集锦-1
  • 原文地址:https://www.cnblogs.com/rask/p/10177906.html
Copyright © 2011-2022 走看看