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.

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

  1. 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(上)——网络

    1.IP地址 每台计算机都需要一个IP地址以识别自己,IP地址由IP协议规定的32位的二进制表示,最新的IPV6协议将IP地址提升为128位,但还不能广泛应用. 32位的IP地址主要分为前缀和后最两部 ...

  2. 《c语言从入门到精通》看书笔记——第14章 文件

    1.文件的基本操作 (1)文件指针 文件指针是指向文件有关信息的指针,这些信息包含文件名,状态,和当前位置,他们保存在一个结构体变量中.在使用文件时需要在内存中为其分配空间,用以存放文件的基本信息.该 ...

  3. 《c语言从入门到精通》看书笔记——第10章 指针

    1.地址与指针 地址:就是内存区中对每个字节的编号 指针:可以看作是内存中的一个地址.在程序中定义了一个变量,在进行编译时就会给该变量在内存中分配一个地址,通过访问这个地址可以找到相应的变量,这个变量 ...

  4. 《c语言从入门到精通》看书笔记——第3章 数据类型

    1.编程规范 (1)代码缩进:统一为4字符,用Tab (2)变量常量命名规范:常量命名统一为大写格式.如果成员变量,均以m_开始.普通变量,取与实际意义相关的名称,要在前面添加类型的首字母,并且名称的 ...

  5. 《c语言从入门到精通》看书笔记——第2章 算法

    1.通常,一个程序包含算法.数据结构.程序设计方法及语言工具和环境这四个方面 2.算法的特性: 有效性.确定性.可行性.输入(一个算法应有零个获多个输入).输出(1个或多个) 3.算法的优劣: (1) ...

  6. 《c语言从入门到精通》看书笔记——第1章 C语言的概述

    1.使用普遍的高级语言有:Fortran/ALGOL/Basic/COBOL/LISP/Pascal/PRLOLG/C/C++/VC/VB/Delphi/Java等 2. C语言是一个面向过程的语言, ...

  7. 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(下)——套接字

    1.套接字概述 套接字是网络通信的基石,是网络通信的基本构件. 所谓套接字,实际上是一个指向传输提供者的句柄.在WinSock中,就是通过操作该句柄来实现网络通信和管理的.根据性质和作用不同,套接字可 ...

  8. 《c语言从入门到精通》看书笔记——第15章 存储管理

    1.内存的组织方式 程序被组织成以下4个逻辑段 (1)可执行代码 (2)静态数据.可执行代码和静态数据存储在固定的内存位置 (3)动态数据(堆).程序请求动态分配的内存来自内存池,也就是上面所列举的堆 ...

  9. 《c语言从入门到精通》看书笔记——第12章 位运算

    1.按位运算就是对字节或字中的实际位进行检测.设置或移位. 位运算符 2.位段的概念与定义 位段类型是一种特殊的结构类型,其所有成员的长度均是以二进制位为单位定义的,结构中的成员被称为位段.位段定义的 ...

最新文章

  1. 利用JDK工具进行系统性能监测
  2. 关于bash中if语法结构的广泛误解(转)
  3. jQuery1.2选择器(1)
  4. 替换换行符:回车换行CR/LF
  5. 话单分析账单分析行踪分析综合数据研判软件
  6. android最低版本+黑域,免root版黑域
  7. uni-app:自定义vue模板
  8. DCEP即将破茧成蝶,数字货币新革命来了
  9. 2019年8月8日 星期四 今日计划
  10. 如何将PDF文件中的繁体字转成简体字?
  11. HTML5期末大作业:轮滑运动体育类人物介绍主题网站设计(12页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计
  12. spoolsv解决方法
  13. windows下安装ruby on rails
  14. 【面试概率题连载2】轻率的陪审团
  15. Navicat for MySQL给用户赋予角色
  16. 统一信息管理平台服务器,4A统一安全管控平台
  17. 886_AUTOSAR_TPS_GenericStructureTemplate33_变体处理例子
  18. 什么是netlogon (摘要)
  19. 小米木丨整体木作:巧用藤编,让家居定制更出彩!-安徽梵衍木业有限公司
  20. 抽象数据类型的实现(复数的四则运算)

热门文章

  1. 快速找到message toast弹出的application代码位置
  2. S4 extension field的异步创建和后台作业
  3. SAP Fiori element框架smart control运行时的生成原理
  4. Revenue Cloud答疑
  5. Middleware trace tool SMWT
  6. PRDICQR action column
  7. /UI5/IF_UI5_REP_PERSISTENCE - why I cannot deploy app to GM6
  8. cgi+bin+php,crontab+php-cgi/php 定时执行PHP脚本
  9. python元类_python中的元类 metaclass
  10. mate 树莓派4b安装ubuntu_树莓派4B安装安装Ubuntu Mate 16.04