C语言收尾 预处理相关知识

简介: C语言收尾 预处理相关知识

一. 预处理详解

1.1 预定义符号

FILE //进行编译的源文件

LINE //文件当前的行号

DATE //文件被编译的日期

TIME //文件被编译的时间

FUNCTION //文件当前所在的函数

STDC //如果编译器遵循ANSI C标准,其值为1,否则未定义

这些预定义符号都是语言内置的

我们来使用下上面的语句



这样我们就可以知道 函数在什么时间 什么地点 发生了什么

1.2 #define 定义标识符号

define可以定义符号

例如

#define MAX 1000
int main()
{
  int m = MAX;
  //int m = 1000;
  printf("%d\n", m);
  return 0;
}

在预处理时其实MAX就变成了1000

这里注意的是define是不能加分号的 否则替换到源文件里面会出现各种问题

1.3 #define 定义宏

我们举个例子

#define SQUARE(x) (x)*(x)
int main()
{
  printf("%d\n", SQUARE(5 + 1));//不要吝啬括号,不加括号有时候可能导致优先级的错误
  printf("%lf\n", SQUARE(5.0));//宏定义不限制类型
  return 0;
}

这里 它就是一个宏 它允许把参数替换到文本中去 这种实现通常称为宏

我们在定义宏的时候一定要注意括号

#define DOUBLE(x) ((x)+(x))
int main()
{
  printf("%d\n", 10 * DOUBLE(3));//最好能把整体也加上括号
  return 0;
}

这题如果不在宏定义时加上整体的一个大括号就会导致输出结果的错误 计算成33

但实际上我们的要求是60

这里还有要注意的一点 注释中的宏是不会被替换的

1.4 #define 的副作用

我们写出以下代码

#define Max(x,y)((x)>(y))?(x):(y)
 
int main()
{
  int a = 5;
  int b = 8;
  int c= Max(a++, b++);
  printf("%d\n", a);
  printf("%d\n", b);
  printf("%d\n", c);
  return 0;
}
 

这里输出结果如下



我们可以发现 其实b是++了两次的

这里就是宏的一个小缺陷

1.5 宏和函数对比

宏通常用于比较简单的运算

例如求两个数中的较大值

为什么这样子呢?

因为

1 宏在规模和速度方面更胜一筹

2 函数必须要声明类型 而宏不用

当然宏也有缺点

  1. 每次使用宏的时候一份宏的代码将会被插入到程序中 除非宏比较短 可能大幅度增加程序的长度
  2. 宏无法调试
  3. 宏无类型定义 不够眼睛
  4. 宏可能会带来操作符优先级的问题 导致程序出错


以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

目录
相关文章
|
1月前
|
C语言 编译器 开发者
【C语言基础】:预处理详解(二)
【C语言基础】:预处理详解(二)
|
1月前
|
编译器 C语言 C++
【C语言基础】:预处理详解(一)
【C语言基础】:预处理详解(一)
|
1月前
|
编译器 C语言
【C语言】:预处理详解
【C语言】:预处理详解
22 0
|
2月前
|
安全 编译器 程序员
C语言(16)----预处理中的宏以及预处理指令
C语言(16)----预处理中的宏以及预处理指令
27 2
|
1月前
|
存储 自然语言处理 编译器
C语言——环境与预处理
C语言——环境与预处理
11 0
|
1月前
|
编译器 C语言
C语言环境处理收尾
C语言环境处理收尾
14 0
|
2月前
|
编译器 C语言 开发者
C语言的预处理
C语言的预处理
24 0
|
2月前
|
存储 自然语言处理 编译器
玩转C语言——文件操作、预处理、编译、链接
玩转C语言——文件操作、预处理、编译、链接
30 0
|
2月前
|
编译器 Linux C语言
【C语言】程序环境预处理 -- 详解(下)
【C语言】程序环境预处理 -- 详解(下)
|
5天前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
14 0
【C语言】字符函数,字符串函数,内存函数