包含头文件
- 指令:
#include
- 用途:将指定的头文件内容插入到当前源文件中,使得当前源文件能够使用头文件中声明的函数、变量、类型定义等。这有助于代码的模块化和复用,提高开发效率。
- 举例:
#include <stdio.h> // 包含标准输入输出头文件,以便使用 printf、scanf 等函数
#include "myheader.h" // 包含自定义头文件
定义宏
- 指令:
#define
- 用途:可以定义常量、函数式宏等。定义常量时,能提高代码的可读性和可维护性;定义函数式宏则可以在一定程度上提高程序的执行效率,但要注意其副作用。
- 举例:
#define PI 3.1415926 // 定义常量 PI
#define MAX(a, b) ((a) > (b)? (a) : (b)) // 定义宏函数,求两个数的最大值
条件编译
- 指令:
#ifdef
、#ifndef
、#if
、#elif
、#else
、#endif
- 用途:根据不同的条件编译不同的代码段,可用于在不同的编译环境或配置下生成不同的目标代码,方便代码的移植和调试,也可以用于避免重复包含头文件等。
- 举例:
#ifdef DEBUG
printf("Debugging information: x = %d\n", x); // 仅在定义了 DEBUG 宏时编译此语句
#endif
#ifndef MY_HEADER_INCLUDED
#define MY_HEADER_INCLUDED
// 头文件的内容
#endif
#if defined(PLATFORM_WINDOWS)
// Windows 平台相关的代码
#elif defined(PLATFORM_LINUX)
// Linux 平台相关的代码
#else
// 其他平台的代码
#endif
取消宏定义
- 指令:
#undef
- 用途:取消之前已定义的宏,在需要重新定义宏或者避免宏的冲突时使用。
- 举例:
#define FOO 100
// 一些使用 FOO 的代码
#undef FOO
#define FOO 200 // 重新定义 FOO
其他编译控制
- 指令:
#pragma
- 用途:向编译器提供特定的编译指示信息,不同的编译器对
#pragma
的支持和具体用法有所不同,常见的如设置编译器的警告级别、控制代码的对齐方式等。 - 举例:
#pragma warning(disable:4996) // 关闭编译器对 4996 号警告的提示
#pragma pack(push, 1) // 设置结构体按 1 字节对齐
struct MyStruct {
char a;
int b;
};
#pragma pack(pop) // 恢复默认对齐方式