在 C 语言标准库中,没有一个统一的、名为 delay.h 的头文件,延迟功能的实现依赖于你正在使用的操作系统或编译器/平台。

(图片来源网络,侵删)
下面我将分情况介绍在不同平台上如何实现延迟,并提供代码示例。
在 Windows 平台下 (使用 <windows.h>)
在 Windows 环境下进行开发(例如使用 Visual Studio 或 MinGW),你可以使用 Windows API 提供的 Sleep() 函数来实现毫秒级的延迟。
- 头文件:
<windows.h> - 函数:
Sleep() - 参数: 以毫秒 为单位的整数。
Sleep(1000);会使程序暂停 1 秒。 - 注意:
Sleep的首字母是大写的 'S'。
示例代码:
#include <stdio.h>
#include <windows.h> // 包含 Windows API 头文件
int main() {
printf("程序开始...\n");
printf("等待 2 秒...\n");
Sleep(2000); // 暂停 2000 毫秒,即 2 秒
printf("等待结束!\n");
return 0;
}
编译和运行:

(图片来源网络,侵删)
- 在 Visual Studio 中,直接编译运行即可。
- 使用 MinGW (GCC) 在命令行编译:
gcc your_file_name.c -o your_program_name.exe ./your_program_name.exe
在 Linux / Unix / macOS 平台下 (使用 <unistd.h>)
在类 Unix 系统(如 Linux, macOS)中,你可以使用 POSIX 标准提供的 usleep() 函数来实现微秒级的延迟。
- 头文件:
<unistd.h> - 函数:
usleep() - 参数: 以微秒 为单位的整数,1 秒 = 1,000,000 微秒。
- 注意:
usleep已被标记为过时,但在大多数现代系统上仍然可用,更现代的替代方案是nanosleep(),但usleep对于简单延迟来说更方便。
示例代码:
#include <stdio.h>
#include <unistd.h> // 包含 POSIX 标准头文件
int main() {
printf("程序开始...\n");
printf("等待 1.5 秒...\n");
usleep(1500000); // 暂停 1,500,000 微秒,即 1.5 秒
printf("等待结束!\n");
return 0;
}
编译和运行: 在 Linux 或 macOS 的终端中使用 GCC 编译:
gcc your_file_name.c -o your_program_name ./your_program_name
在嵌入式系统 / 单片机 平台下 (如 AVR, STM32)
在嵌入式开发中,你通常不会使用操作系统提供的延迟函数,而是通过操作硬件定时器或使用编译器提供的特殊函数来实现精确的延迟。

(图片来源网络,侵删)
a) AVR (Arduino) 平台
Arduino 的核心是 C++,但其底层是基于 C 语言的,它提供了一个非常方便的 delay() 函数。
- 头文件:
<Arduino.h>(通常在 Arduino IDE 中会自动包含) - 函数:
delay() - 参数: 以毫秒 为单位的整数。
示例代码 (Arduino IDE):
// 在 Arduino IDE 中,这是一个标准的 C/C++ sketch
#include <Arduino.h> // 通常不需要显式包含,但写上更清晰
void setup() {
Serial.begin(9600); // 初始化串口通信
Serial.println("程序开始...");
Serial.println("等待 2 秒...");
delay(2000); // 暂停 2000 毫秒
Serial.println("等待结束!");
}
void loop() {
// 主循环
}
b) STM32 (使用 HAL 库)
对于 STM32 等更复杂的 ARM Cortex-M 微控制器,通常使用厂商提供的硬件抽象层,如 STM32CubeMX 生成的 HAL 库,这里,延迟通常通过 HAL_Delay() 函数实现,它依赖于系统滴答定时器。
- 头文件:
stm32f1xx_hal.h(根据你的具体系列而变化) - 函数:
HAL_Delay() - 参数: 以毫秒 为单位的整数。
示例代码:
#include "main.h" // 这是 STM32CubeMX 生成的头文件,包含了所有必要的 HAL 头文件
int main(void) {
// ... HAL_Init() 和 SystemClock_Config() 等初始化代码 ...
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init(); // 假设你初始化了串口
printf("程序开始...\n"); // 需要实现 printf 到串口的重定向
printf("等待 2 秒...\n");
HAL_Delay(2000); // 使用 HAL 库的延迟函数
printf("等待结束!\n");
while (1) {
// 主循环
}
}
跨平台延迟 (C++11 及以后)
如果你正在使用 C++11 或更高版本,你可以使用 <chrono> 和 <thread> 库来实现跨平台的延迟,这在 C++ 项目中是推荐的做法。
- 头文件:
<chrono>,<thread> - 方法:
std::this_thread::sleep_for()
示例代码 (C++):
#include <iostream>
#include <chrono> // 用于时间
#include <thread> // 用于线程和延迟
int main() {
std::cout << "程序开始..." << std::endl;
std::cout << "等待 2 秒..." << std::endl;
// 暂停当前线程 2 秒
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "等待结束!" << std::endl;
return 0;
}
总结与建议
| 平台 | 推荐方法 | 头文件 | 函数 | 单位 |
|---|---|---|---|---|
| Windows | Windows API | <windows.h> |
Sleep() |
毫秒 |
| Linux/Unix/macOS | POSIX 函数 | <unistd.h> |
usleep() |
微秒 |
| AVR (Arduino) | Arduino 函数 | <Arduino.h> |
delay() |
毫秒 |
| STM32 (HAL) | HAL 库函数 | stm32fXxx_hal.h |
HAL_Delay() |
毫秒 |
| 跨平台 C++ | C++11 标准 | <chrono>, <thread> |
sleep_for() |
任意时间单位 |
核心要点:
- 没有万能的
delay.h: 你必须根据你的目标平台来选择正确的延迟方法。 - 优先使用平台标准: 在 Windows 上用
Sleep(),在 Linux 上用usleep(),这是最直接的方式。 - 嵌入式系统看手册: 在单片机开发中,请务必查阅你所使用的芯片的数据手册和官方库文档。
- C++ 的现代方案: 如果你的项目是 C++,优先考虑使用
<chrono>和<thread>,它们更灵活、更安全且跨平台。
