做网站 技术便宜做网站价格
18. 宏与预处理 - <stddef.h> 和 <stdbool.h>
 
C语言的宏和预处理指令在程序编译之前就被执行,用于文件包含、符号定义、条件编译等操作。理解和运用宏和预处理可以提高代码的灵活性和可移植性。
18.1 宏定义与条件编译
18.1.1 #define 与参数化宏
 
#define 是用来定义宏的指令,宏可以是简单的常量值或复杂的参数化宏。
-  
简单宏定义:
#define PI 3.14159定义一个常量
PI,可以在程序中用PI替代3.14159。 -  
参数化宏:
#define SQUARE(x) ((x) * (x))定义一个参数化宏
SQUARE,用于计算一个数的平方。 -  
使用注意:
- 参数化宏的参数要用括号括起,防止计算时出现优先级问题。
 - 宏替换是纯文本替换,因此存在潜在的错误风险。
 
 
18.1.2 条件编译:#ifdef, #ifndef, #if, #elif, #else, #endif
 
条件编译用于在编译过程中有选择地包括或排除代码段。
-  
基本用法:
#ifdef DEBUG # define LOG(msg) printf("DEBUG: %s\n", msg) #else # define LOG(msg) #endif该代码段定义了一个在调试模式下有效的日志宏。
 -  
使用场景:
- 控制调试输出代码。
 - 根据平台或环境选用不同的代码路径。
 
 
18.2 预定义宏与文件包含
18.2.1 常见预定义宏:__FILE__, __LINE__, __DATE__, __TIME__
 
这些宏可以在程序中提供有用的调试信息。
__FILE__:当前文件名。__LINE__:当前行号。__DATE__:编译日期。__TIME__:编译时间。
示例:
printf("Error in file %s at line %d\n", __FILE__, __LINE__);
 
18.2.2 文件包含:#include 与防止重复包含的 #pragma once 或 #ifndef 宏
 
#include:用于包含头文件。- 防止重复包含: 
- 使用 
#pragma once - 或者
#ifndef HEADER_FILE #define HEADER_FILE // 内容 #endif 
 - 使用 
 
18.3 内联函数与宏
18.3.1 内联函数的优势与使用:inline
 
内联函数是在编译时请求编译器将函数代码直接嵌入调用点,避免了函数调用开销。
-  
使用方法:
inline int add(int a, int b) {return a + b; } -  
优势:
- 类型检查:内联函数具有函数的类型安全性。
 - 调试性:相较于宏,内联函数更容易调试。
 
 
18.3.2 宏与内联函数的比较
-  
宏:
- 优势:在编译前替换,可以用于非常简单的代码优化。
 - 劣势:不进行类型检查,易导致隐秘的错误。
 
 -  
内联函数:
- 优势:提供类型安全,支持复杂的逻辑。
 - 劣势:可能不如宏优化彻底,在某些编译器中可能不完全内联。
 
 
使用宏和内联函数时,需要权衡代码的清晰性、可维护性和性能之间的关系。
