《c语言从入门到精通》看书笔记——第13章 预处理

1、宏定义
     宏定义是预处理命令的一种,它提供了一种可以替换源代码中字符串的机制。
     宏定义指令#define用来定义一个标识符和一个字符串,一这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。宏定义的作用相当于给指定的字符串起一个别名。
     1)不带参数的宏定义一般形式如下:
          #define     宏名     字符串
         说明:
               (1)#表示这是一条预处理命令。
               (2)宏名是一个标识符,必须符合C语言标识符规定
               (3)字符串这里可以使常数、表达式、格式字符串等。
               (4)  宏定义不是c语句,不需要在行末加分号
               (5)如果在串中含有宏名,则不进行替换。
               (6)如果串长于一行,可以在该行末尾用用一反斜杠“\”续航
               (7)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到此源文件结束
               (8)可以用#undef命令终止宏定义的作用域
               (9)宏定义用于预处理命令,它不同于定义的变量,只作字符串替换,不分配内存空间。
     2)带参数的宏定义
          带参数的宏定义不是简单的字符串替换,还要进行参数替换,其一般形式如下:
          #define     宏名(参数表)字符串
          如:#define MIX(a,b) ((a)*(b)+(b))
          说明:
               (1)宏定义时参数要加括号,如不加括号,则有时结果是正确的,有时结果是不正确的。
               (2)宏扩展必须使用括号来保护表达式中低优先级的操作符,以确保调用时达到想要的结果。
2、#include 指令
     在一个源文件中使用#include指令可以将另一个源文件的全部内容包含进来,也就是将另外的文件包含到本文件中。#include使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:
      #include"stdio.h"
     #include<stdio.h>
     这两种方式的区别:
          用尖括号时,系统到存放C库函数头文件所在的目录中寻找要包含的文件,这是标准方式。用双引号时,系统先在用户当前目录中寻找要包含的头文件,若找不到,再到存放头文件所在的目录寻找要包含的文件。通常情况下, 如果要调用库函数用#include"_”如果要包含用户自己编写的文件,一般用双引号#include<_>。
      经常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,一般以.h为后缀。
      一般情况下将如下内容放到.h文件中:
          (1)宏定义。
          (2)  结构、联合和枚举声明。
          (3)typedef声明
          (4)外部函数声明
          (5)全局变量声明
3、条件编译
     (1)#if命令
          #if的基本含义是:如果#if命令后的参数表达式为真,则编译#if到#endif之间的程序段,否则跳过这段程序。
          #if命令的一般形式为:
          #if 常数表达式
               语句段
          #endif
          #elif指令用来建立一种“如果。。。或者如果。。”这样阶梯状多重编译操作选择,这与多分支if语句中的else if类似。
          #elif的一般形式如下:
          #if 表达式
               语句段
          #elif 表达式1
               语句段
          #elif  表达式2
               语句段
           。。。
          #elif 表达式n
               语句段
          #endif
     (2)#ifdef及#ifndef命令
          不需要判断具体值,只需要知道这个符号常量是否被定义了,则采用#ifdef与#ifndef命令,分别表示“如果有定义”及“如果无定义”。
          1)#ifdef的一般形式:
          #ifdef 宏替换名
               语句段1
          #else
               语句段2
          #endif
          其含义是:如果宏替换名已被定义过,则对“语句段”进行编译;如果未定义#ifdef后面的宏替换名,则对“语句段2”进行编译。
         2)  #ifndef的一般形式:
          #ifndef 宏替换名
               语句段1
          #else
               语句段2
          #endif
          其含义是:如果未定义#ifndef后面的红替换名,则对“语句段1”进行编译;如果定义#ifndef后面的宏替换名,则对“语句段2”进行编译。
     (3)#undef命令
          使用#undef命令可以删除事先定义了的宏定义。
          #undef命令的一般形式如下:
          #undef 宏替换名
          #undef的主要目的是将宏名局限在仅需要他们的代码段中
     (4)#line命令
          #line命令改变_LINE_与_FILE_的内容,_LINE_存放当前编译行的行号,_FILE_存放当前编译的文件名。
          #line命令的一般形式如下:
          #line 行号["文件名"]
          其中,行号为任一正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的额名字。#line命令主要用于调试及其他特殊应用。
     (5)#pragma命令
          #pragma命令的作用是设定编译器的状态,或者指示编译器完成一些特定的动作。
          #pragma命令的一般形式为:
          #pragma 参数
          参数可以为以下几种:
          1)message参数能够在编译信息输出窗口中输出的相应信息
          2)code_seg参数设置程序中函数代码存放的代码段
          3)once参数保证头文件被编译一次
     (6)预定义宏名
          ANSI标准说明了以下5个预定义宏替换名
          1)_LINE_:其含义是当前被编译代码的行号
          2)_FINE_:其含义是当前源程序的文件名称
          3)_DATE_:其含义是当前源程序的创建日期
          4)_TIME_:其含义是当前源程序的创建时间
          5)_STDC_:其含义是用来判断当前编译器是否为标准C,若其值为1则表示符合标准C,否则不是标准C.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风中月隐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值