r54n1j2zvsc6401887058.png
- D( x' {/ Z( o# N
0 \, d3 y( I& [3 c' x) ~C语言的预处理是在编译之前对源代码进行处理的阶段,它主要由预处理器完成。预处理器是一个独立的程序,它负责对源代码进行一些文本替换和处理,生成经过预处理的代码。以下是C语言预处理的一些重要特性:
/ p% ?9 s: S: g& I$ Z1,头文件包含#include 作用:将其他文件的内容包含到当前文件中。: m/ R# h, Y! w$ J8 b4 o8 u( {* ~8 j
示例:#include指令用于包含标准库头文件,如上例中的 。
6 c9 a0 w4 ?6 O6 R; i2 b
$ I7 Q8 [6 `$ i8 }2,宏定义#define PI 3.14159作用:创建宏,用指定的文本替换源代码中的标识符。- Q! x8 D; V* a" B1 |
示例:上例中PI将在源代码中被替换为3.14159。4 C" v$ } w# v2 o5 d' F8 X# N
0 ?: L! G( f7 j1 v& Z; W; P3,条件编译#ifdef DEBUG// 调试模式下的代码#endif作用:根据条件选择性地编译代码。
% w1 h8 `3 d3 K7 W v示例:定义了DEBUG宏,#ifdef DEBUG和#endif之间的将被编译。
) s9 j3 ]# Q% {- }7 x; Q. l: L0 |5 f! f( W
4,条件包含#if SIZE == 64 #include "header64.h"#else #include "header32.h"#endif作用:根据条件选择性地包含头文件。
6 L5 F& q/ g1 { o) p1 Q1 m示例:定义了SIZE为64,则包含header64.h,否则包含header32.h。
+ J5 ~, [9 T& R$ D" t; i
. Y2 l3 u" z; `" L. S& y" P) O5,标识符连接#define CONCAT(x, y) x ## yint result = CONCAT(10, 20); // 相当于 int result = 1020;作用:将两个标识符连接为一个标识符。2 Z8 S1 _* i2 t# n) e
示例:上例中CONCAT(10, 20)被连接为1020。
2 Y) l O4 q; E: o ]5 d# p% q( P1 W2 k c' K
6,条件编译中的宏定义#if defined(DEBUG) && (LOG_LEVEL > 1) // 在调试模式且日志级别大于1时执行的代码#endif作用:在条件编译中使用宏定义进行更复杂的条件判断。: y& F2 ?% x* {7 V
示例:上例中,当定义了DEBUG宏并且LOG_LEVEL大于1时,才会编译对应的代码块。9 k6 B6 B% a5 A6 O5 |9 ~( D
' `6 e( o* t9 P- G6 `7,#undef 指令#undef PI#define PI 3.1415926535作用:取消已定义的宏,然后重新定义。$ H6 \: a: q4 J3 ^
示例:上例中,取消了之前定义的PI宏,然后重新定义为更精确的值。
7 z+ Y( h) I5 O- w
1 X# O l2 Q2 A, @8,#error 指令#if !defined(CONFIG) #error "CONFIG macro is not defined!"#endif作用:在编译过程中产生错误消息。
7 H/ E( {' r. k; d! f示例:如果CONFIG宏没有被定义,将产生编译错误并显示错误消息。* R" Y0 R& \% [5 Y$ p5 Q" k+ k
==========+ u' M4 `3 m& T$ T. K1 j2 G
往期回顾:面试题--函数指针的五大作用
?% `+ S, j' k& C* x, C. F中值滤波的原理和C代码! q- ]2 t. h4 v4 S: P# [
移动平均滤波的原理和C代码
" H" V0 f5 E0 K; [; ?MOS管防反接电路# z; } p; y$ Z- v9 v( l6 @
==========
9 r' R1 v- n7 [8 r1 k/ s
7 b6 E! T, m+ u, D
zlph3gtyzzq6401887158.png
4 D7 g6 |# I! U( A9 w
1 \! X2 f5 \$ f: E; _4 k
pdegootuaja6401887258.png
" ]8 s' O) e& J# ]+ N8 T0 V
( P7 H7 v8 \% T' C: I! x
1ubsewtvw3x6401887359.png
|