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。

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

原文地址:https://www.cnblogs.com/rask/p/10177906.html

时间: 2024-10-14 13:41:24

C08 C语言预处理命令的相关文章

C语言预处理命令详解

一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置. 预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译. C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define).文件包含(#include).条件编译(#ifdef)等.合理使用预处理功能编

C语言预处理命令总结大全

C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANSI标准定义的C语言预处理程序包括下列命令: #define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等.非常明显,所有预处理命令均以符号#开头,下面分别加以介绍. 一 #define 命令#d

C语言预处理命令

1.#error Directive (C/C++) The #error directive emits a user-specified error message at compile time and then terminates the compilation. #error token-string The error message that this directive emits includes the token-string parameter. The token-s

使用预处理命令实现C的范型编程

一.引言 Generic programming is a style of computer programming in which algorithms are written in terms of types to-be-specified-later that are then instantiated when needed for specific types provided as parameters. 范型编程在1973年的ML语言中首次提出,是在C语言之后诞生的,你可以轻

C语言第十一回合:预处理命令的集中营

  [学习目标]   1.         宏定义 2.         文件包括"处理 3.         条件编译 预处理命令:能够改进程序设计的环境.提高编程效率. 其功能主要有三种:宏定义.文件包括.文件编译. ANSI标准定义的C语言预处理指令预览表 A: 宏定义 (a)不带參数的宏定义 格式:#define标识符 字符串 如:#define PI 3.1415926 *标识符被称为:宏名 *在预编译时将宏名替换成字符串的过程为:宏展开. *#define 是宏定义命令 //求圆周长

C语言之预处理命令

/**************************************************************************** Title:C之预处理命令 Time:2014年7月26日 **************************************************************************/ 大一时学过,C语言中预处理命令功能分为3种.(宏定义,文件包含和条件编译) 一:宏定义 格    式       #define  

9、C语言之预处理命令

预处理命令 基本概念:ANSI C标准规定可以在C源程序中加入一些"预处理命令",以改进程序设计环境,提高编程效率. 这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们).必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行"预编译" 经过预处理后的程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码. C语言与其他高级语言的一个重要区别是可以使用预处理命令和具

C语言中的预处理命令

预处理功能是C语言的重要功能. 问:为什么要预处理,什么是预处理? 答:我们知道高级语言的运行过程是通过编译程序(编译器)把源代码翻译成机器语言,实现运行的.编译程序的工作包含:语法分析.词法分析.代码生成.代码优化等.但是在正式编译之前还有一些工作要做,例如:去掉注释.变换格式之类的.C语言允许在源程序中包含预处理命令,正式编译(词法分析)前,先对这些命令进行"预处理":然后在进行通常的编译处理.预处理命令从语法上讲不是C语言的一部分,但扩展了C语言程序设计的环境,简化程序开发过程:

程序猿之--C语言细节15(预处理命令细节#error、运算符#和##、__FILE__、__LINE__)

主要内容:预处理命令细节#error.运算符#和##.__FILE__.__LINE__ #include <stdio.h> /* 包含这个头文件,并不是将其所有函数都链接进程序*/ /* ##运算符 */ #define MK_ID(n) i##n /* 表示将两个记号连接 */ int MK_ID(1), MK_ID(2),MK_ID(3); /* 预处理后变成int i1,i2,i3;*/ /* 定义多个type##_max函数,函数返回类型和参数类型用define决定 * 如GENE