关闭

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

标签: c语言宏定义预处理条件编译#include指令
283人阅读 评论(0) 收藏 举报
分类:
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
0
查看评论

java从入门到精通实例版

java从入门到精通实例版是一本权威的java图书,明日科技编著,已经将其扫描为pdf高清文档,并附带了相应的光盘代码,用户可以放在电脑上、手机上阅读。    全书从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了进行java应用程序开发应...
  • folgenfF
  • folgenfF
  • 2018-01-10 14:18
  • 48

C语言入门教程:c语言从入门到精通(2016最新版)

C语言入门教程地址:http://c.biancheng.net/cpp/u/jiaocheng/
  • hhsu28
  • hhsu28
  • 2016-10-25 20:45
  • 765

Java从入门到精通阅读笔记(第4版)4

Java常见异常 ClassCastException 类型转换异常 ClassNotFoundException 未找到相应类异常、 ArithmeticException算数一场 ArrayIndexOutOfBoundsException数组下标越界异常 ArratStoreExce...
  • zarathurstra
  • zarathurstra
  • 2017-03-02 21:21
  • 530

C语言从入门到精通所需的7本书

1. C Primer Plus  ![image.png](http://upload-images.jianshu.io/upload_images/1956008-f959cc5bbec7f36f.png?imageMogr2/auto-orient/strip%7Cima...
  • bobohelloworld
  • bobohelloworld
  • 2018-01-12 23:49
  • 128

linux从入门到精通(第2版)pdf

下载地址:网盘下载 内容简介 编辑 Linux是目前增长最迅速的操作系统。《Linux从入门到精通》由浅入深、循序渐进地向读者介绍Linux的基本使用和系统管理。全书内容包括Linux概述、Linux安装、Linux基本配置、桌面环境基本操作、Shell基本命令、文件和...
  • cf406061841
  • cf406061841
  • 2017-05-30 12:56
  • 1866

ORACLE从入门到精通 明日科技编著 清华大学出版社

http://pan.baidu.com/s/1gePoRAV
  • ggkmskj
  • ggkmskj
  • 2017-06-07 17:04
  • 1158

Java从入门到精通阅读笔记(第4版)6

大数字运算 Java中提供了大数字的操作类,即java.math.BigInteger和java.math.BigDecimal类 BigInteger public BigInteger(String val) BigInteger twoInstance=new BigInteger(&quo...
  • zarathurstra
  • zarathurstra
  • 2017-03-07 21:10
  • 481

asp.net从入门到精通第三版光盘全部内容

asp.net从入门到精通第三版光盘
  • qq_22973115
  • qq_22973115
  • 2016-10-03 18:05
  • 2337

书单(一)JavaScript从入门到精通(第二版)

书单(一)JavaScript从入门到精通(第二版) 1、这本书适合初学JavaScript的同学们,因为我也是刚刚进入web开发的行列来,所以也是小白一名,选择这本书作为入门,应该可以的。 2、读这本书之前,可能你都不知道什么是JavaScript,JQuery,Ajax等等,学习web方面就是术...
  • wild46cat
  • wild46cat
  • 2016-03-15 23:58
  • 965

读《Oracle从入门到精通》笔记--持续更新中

第一章 Oracle 11g概述 1.6节 启动与关闭数据库实例 启动数据库: Startup [nomount|mount|open|force][resetrict][pfile=filename] 解释:nomount ---> 表示启动实例不加载数据库 mount --...
  • u011009161
  • u011009161
  • 2016-05-06 19:44
  • 1842
    个人资料
    • 访问:17171次
    • 积分:403
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章分类