C语言备忘录 – 17. 预处理与宏定义

C语言备忘录 – 17. 预处理与宏定义一 预处理器预处理器是在编译器编译代码前工作 简单来说 就是一个文本替换工具 它会指示编译器在实际编译之前完成所需的预处理

欢迎大家来到IT世界,在知识的湖畔探索吧!

一、预处理器

预处理器是在编译器编译代码前工作。简单来说,就是一个文本替换工具,它会指示编译器在实际编译之前完成所需的预处理。

预处理指令

描述

#include

包含一个源代码文件

#define

定义宏

#undef

取消已定义的宏

#ifdef

如果宏已经定义,则返回真

#ifndef

如果宏没有定义,则返回真

#if

如果给定条件为真,则编译下面代码

#elif

与 #if 配合使用,表示其他条件分支

#else

与 #if 配合使用,表示其他分支

#endif

结束 #if 语句

#error

当遇到标准错误时,输出错误消息

#pragma

使用标准化方法,向编译器发布特殊的命令

二、头文件

头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。

使用预处理指令 #include 可以引用用户和系统头文件。它的形式有以下两种:

  • #include < > 引用的是编译器的类库路径里面的头文件。
  • #include ” ” 引用的是当前程序目录的相对路径中的头文件,如果在当前程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件。

常见的系统头文件:

头文件

简介

<stdio.h>

标准输入输出库,包含 printf、scanf 等函数

<stdlib.h>

标准库函数,包含内存分配、程序控制等函数

<string.h>

字符串操作函数,如 strlen、strcpy 等

<math.h>

数学函数库,如 sin、cos、sqrt 等

<time.h>

时间和日期函数,如 time、strftime 等

<ctype.h>

字符处理函数,如 isalpha、isdigit 等

<limits.h>

定义各种类型的限制值,如 INT_MAX 等

<float.h>

定义浮点类型的限制值,如 FLT_MAX 等

三、宏定义

宏定义只是简单地进行替换,并且由于预处理器是在编译之前进行,所以编译器不会对宏定义进行语法检查。

1. 常见的预定义宏

#include <stdio.h> int main() { /* 当前文件名称字符常量 */ printf("File: %s\n", __FILE__); /* 当前日期,"MMM DD YYYY" 格式的字符常量 */ printf("Date: %s\n", __DATE__); /* 当前时间,"HH:MM:SS" 格式的字符常量。 */ printf("Time: %s\n", __TIME__); /* 当前行号,一个十进制常量。 */ printf("Line: %d\n", __LINE__); return 0; }

欢迎大家来到IT世界,在知识的湖畔探索吧!

2. 自定义宏

欢迎大家来到IT世界,在知识的湖畔探索吧!#include <stdio.h> /* 整数常量宏 R */ #define R 10 /* 浮点数常量宏 PI */ #define PI 3.14 /* 宏定义中使用其他宏 */ #define V PI * R * R * R * 4 / 3 /* 带参数的宏定义 */ #define MAX(x, y) ((x) > (y) ? (x) : (y)) /* 支持可变参数 */ #define SHOWLIST(...) printf(#__VA_ARGS__) int main() { printf("体积V = %.2f\n", V); printf("Max = %d\n", MAX(10, 20)); SHOWLIST(liwy, liwy1, liwy2\n); return 0; }

带参数的宏其参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。

3. 预处理器运算符

  • 换行符号(\)
  • 字符串常量化运算符(#),将宏的参数转换为字符串常量。
  • 标记粘贴运算符(),将两个标记合并为一个标记。
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b "\n") #define tokenpaster(n) \ printf("token" #n " = %d\n", tokenn) int main() { message_for(liwy, nan); // liwy and nan int token34 = 40; tokenpaster(34); // token34 = 40 return 0; }

4. typedef 与 #define 的区别

  • typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名。
  • typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/83230.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信