c语言----预处理

    • 不带参数的宏
    • 带参数的宏
  • 头文件
  • 条件编译
    • #if 命令
    • #else 与#elif
    • #ifdef及#ifndef命令
  • #progma命令
  • 预定义宏名

不带参数的宏

宏定义指令#define 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。它的作用相当于给指定的字符串起一个别名。

不带参数的宏的一般形式如下

#define 宏名 字符串
  • "#"表示这是一条预处理命令。
  • 宏名是一个标识符,必须符合C语言标识符的定义。
  • 字符串可以是整数,表达式,格式字符串等。
  • 宏定义用于预处理命令,它不同于定义的变量,只做字符替换,不分配内存

例如:

#define PI 3.14159

它的作用是在程序中用PI替代3.14159 ,在编译预处理时,每当在源程序中遇到PI时将自动转换为3.14159

  • 可以用 #undef命令来终止宏定义的作用域。

带参数的宏

带参数的宏不仅是简单的字符替换,还可以进行参数替换。一般形式如下:

#define 宏名(参数表) 字符串
//参数表里的参数叫实参,字符串中为形参。

例如:对两个数实现乘法和加法的混合运算。

#include<stdio.h>
#define MIX(a,b) ((a)*(b)+(b))void main(){int x = 5,y = 9;
printf("%d\n",MIN(x,y))
return 0;
}
  1. 用宏替换函数的好处:是宏替换增加了代码的执行速度,因为不存在函数调用。但是也由于重复编码而增加了程序的长度。

对于带参数的宏有以下几点需要注意:

1.宏定义时参数要加括号,若不加括号,有时结果对有时错。

  1. 宏扩展必须使用括号来保护表达式中低优先级的操作符,以便确保得到想要的结果。
  2. 对带参数的宏的展开只是将语句中的宏后面括号内的实参字符串代替#define命令行中的形参。
  3. 在宏定义时,宏名与带参数的括号之间不可以以加空格,否则将空格以后的字符串都作为替换字符串的一部分。
  4. 在带参数的宏中,形式参数不分配内存单元,因此不必做类型定义。

头文件

一般情况下将以下内容放到.h文件中:

  • 宏定义。
  • 结构体、联合和枚举声明。
  • typedef 声明。
  • 外部函数声明。
  • 全局变量声明。

使用头文件有以下几点需要注意:

  1. 文件包含是可以嵌套的,即在一个被包含文件中还可以包含另一个被包含文件。
  2. 当file1.h 中包含file2.h,预编译后就成为一个文件而不是两个文件,这是如果file2.h中有全局静态变量,则该变量在file1.h中也有用,不需要再用extern声明。

条件编译

#if 命令

#if的基本含义是,如果#if命令后的参数表达式为真,则编译#if#endif之间的程序段,否则跳过这段程序。#endif命令用来表示#if段的结束。

一般格式如下:

#if 常数表达式语句段
# endif
  • 如果常数表达式为真,则这段程序会编译,否则跳过。

例如:

#include<stdio.h>
#define NUM 50
void main(){int i = 0;#if NUM>50 i++;#endif#if NUM==50i = i+50;#endifprintf("%d\n",i);
return 0;
}

#else 与#elif

  • #else:的作用是当#if为假时提供另一种选择,作用和条件判断中的else相似。
  • #elif:用来建立一种 “如果…或者如果…”的形式。

#ifdef及#ifndef命令

#if条件编译命令中,需要判断符号常量所定义的具体值,但有时并不需要判断具体值,只需要知道这个符号常量是否被定义了,这时就需要采用另一种条件编译的方法,即#ifdef#ifndef命令,它们分别表示“如果有定义”和“如果无定义”。

#ifdef命令的一般形式:

#ifdef 宏替换名
语句段
#endif

其意义是:如果宏替换名已经被定义过,则对“语句段”进行编译。

#ifndef命令的一般形式:

#ifndef 宏替换名
语句段
#endif

其意义是:如果宏替换名没有被定义过,则对“语句段”进行编译。

#progma命令

#progma命令的作用是设定编译器的状态,或者指示编译器完成一些特定的动作。

一般形式如下:

#progma 参数

参数可以是以下几种情况:

  • message参数:该参数能够在编译信息输出窗口中输出相应的信息。
  • code_seg参数:设置程序中函数代码存放的代码段。
  • once参数:保证头文件被编译一次。

预定义宏名

ANS标准说明了5个预定义宏替换名

  • **_LINE_**:其含义是当前被编译代码的行号。
  • _FILE_:其含义是当前源程序的文件名称
  • _DATE_:其含义是当前源程序的创建日期
  • _TIME_:其含义是当前源程序的创建时间
  • _STDC_:其含义是用来判断当前编译器是否为标准C,其值为1表示符合,否则不是。

c语言----预处理相关推荐

  1. C语言中编译预处理命令作用,C语言预处理命令详解

    原标题:C语言预处理命令详解 关注百问科技并将它设为星标 不错过任何一篇嵌入式干货 ------ 作者:clover_toeic 原文出处: https://www.cnblogs.com/clove ...

  2. C语言预处理命令(预处理指令)

    C语言预处理命令分为:宏定义.文件包含.条件编译 什么是预处理命令? 预处理命令属于C语言编译器,而不是C语言的组成部分 预处理命令的作用:就是在编译和链接之前,对源文件进行一些文本方面的操作,比如文 ...

  3. 基于C99规范,最全C语言预处理知识总结

    基于C99规范,最全C语言预处理知识总结 00. 前言 1. 语法形式 2. 描述 3. 约束 4. 语义 01. 条件包含 01.1 关于`defined` 01.2 关于`#if/#elif/#e ...

  4. C语言预处理指令大全

    C语言预处理指令 文章目录 C语言预处理指令 define 语法 Linux编译时指定宏的值及宏 删除已有的宏 C语言允许多参数的宏及宏函数 宏函数需要注意的事项 参数宏创建字符串 预处理粘合剂 li ...

  5. 【维生素C语言】第十七章 - C语言预处理(上)

    楼下大爷看完直呼简单!C语言预处理(上) 前言: 本章将对预处理知识进行讲解.首先介绍预定义符号,随后着重讲解预处理指令.介绍预处理操作符,最后将宏和函数进行对比. 一.预处理 0x00 什么是预处理 ...

  6. 【维生素C语言】第十七章 - C语言预处理(下)

    楼下大妈看完广场舞都想不跳了!C语言预处理(下) 前言: 本文为C语言预处理的下篇,本文将进一步讲解预处理的基本知识,对命令行定义进行讲解.对条件编译的语句进行逐个讲解,理解两种文件包含的方式.

  7. c语言预处理意义,C语言预处理

    C语言预处理教程 所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是 C 语言提供了多种预处理功能,如宏定义.文件包含. 条件编译等.合理地使用预处理功能编写的程序便于 ...

  8. c语言编译预处理指令大全,C语言预处理指令

    「今天是学习C语言第 32 天」 当你选择了一种语言,意味着你还选择了一组技术.一个社区.--Joshua Bloch # 预处理 C语言源程序先经过预处理器进行预处理,之后经过编译器编译成二进制可执 ...

  9. c语言预处理和连接区别,C语言预处理运算符

    预处理还需要运算符?有没有搞错? ^_^, 没有搞错,预处理是有运算符,而且还不止一个: #(单井号)    -- 字符串化运算符. ##(双井号 )-- 连接运算符 #@               ...

最新文章

  1. java interface list_你了解注解内的@interface List么
  2. MyEclipse 6.5 快捷键
  3. 2.两个VLAN通过一个交换机与路由器的连接
  4. 知其然不知其所以然的悲惨后果【EF CodeFirst 实体关系两日游】
  5. STM32F4_USART配置及细节描述
  6. 在CXF API和拦截器中添加Gzip压缩
  7. np读取csv文件_被 Pandas read_csv 坑了
  8. 大文件上传组件集成说明
  9. 190402每日一句
  10. 解决:wordpress 安装主题时,要求FTP
  11. Gradient Descent
  12. Excel 如何引用某表格中的某一列作为数据有效性验证
  13. redis cli命令详解
  14. php实现报表拖拉拽,看!这款BI工具用拖拉拽的方式做报表
  15. Echarts南丁格尔图.
  16. c语言局部变量stu,C语言学习笔记
  17. 社工利器--setoolkit之钓鱼攻击
  18. Linux内核的配置和编译
  19. 0704一阶线性微分方程-微分方程
  20. CVPR 2019 论文解读 | 基于多级神经纹理迁移的图像超分辨方法 (Adobe Research)

热门文章

  1. 怎么向后删除?(删除光标后的字符)(按delete键)
  2. vscode运行虚拟环境virtualenv时报错:\Scripts\Activate.ps1,因为在此系统上禁止运行脚本
  3. python 如何将数字字符串转换为数字?
  4. Intel Realsense D435 摄像头插入电脑无法监测(识别)的可能原因及解决方案 USB SCP overflow
  5. Dex-net再次复现
  6. 根据HttpServletRequest request 获取当前用户ip地址和ip所属区域
  7. 二进制查找替换常用函数
  8. java常用框架总结
  9. json java 实例_java JSON数据转对象
  10. 最长回文串_LeetCode解析,第五题:最长回文子串