zoukankan      html  css  js  c++  java
  • 『C程序设计』读书笔记系列文章之第八章 预编译处理

    c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译

    1. 宏定义

    不带参数的宏定义
    用一个指定的标识符来代表一个字符串,形式:#define 标识符 字符串
    几点说明:
    1) 宏名一般用大写
    2) 宏定义不作语法检查,只有在编译被宏展开后的源程序时才会报错
    3) 宏定义不是c语句,不在行末加分号
    4) 宏名有效范围为定义到本源文件结束
    5) 可以用#undef命令终止宏定义的作用域
    6) 在宏定义时,可以引用已定义的宏名

    带参数的宏定义
    定义形式:#define 宏名(参数表) 字符串
    这和函数有些类似,但他们是不同的:
    1) 函数调用时,先求实参表达式值,再代入形参,而宏只是简单替换,并不求值
    2) 函数调用是在程序运行时分配内存的,而宏展开时并不分配内存,也没有返回值的概念
    3) 对函数中的实参和形参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型。
    4) 函数只有一个返回值,而宏可以得到几个结果
    5) 宏替换不占运行时间,只占编译时间,而函数调用占运行时间

    2. 文件包含处理

    #include "文件1" 就是将文件1的全部内容复制插入到#include位置,作为一个源文件进行编译。
    在#include命令中,文件名可以用" "也可以用< >,假如现在file1.c中包含file2.h文件," "表示系统先在file1.c所在目录中找file2.h,如果找不到,再按系统指定的标准方式检索目录,< >表示系统直接按指定的标准方式检索目录。所以用" "保险一点。

    3. 条件编译

    条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:
    1)#ifdef 标识符
      程序段1
      #else
    程序段2
    #endif
    它的作用:当标识符在前面已经被定义过(一般用#define),则对程序段1编译,否则对程序段2编译。
    2)#ifndef 标识符
    程序段1
    #else
    程序段2
    #endif
    它的作用和#ifdef相反,当标识符没被定义过,对程序段1编译,否则对程序段2编译。
    3)#if 表达式
    程序段1
      #else
     程序段2
    #endif
    它的作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。

  • 相关阅读:
    980不同路径III
    输入函数
    IDEA更新maven依赖包
    join()函数
    方差偏差困境
    np.bincount()函数
    72编辑距离
    741摘樱桃
    523连续的子数组和
    1306跳跃游戏III
  • 原文地址:https://www.cnblogs.com/michaelxu/p/1169935.html
Copyright © 2011-2022 走看看