C语言标准库中并没有一个叫做 delay 的标准函数。

(图片来源网络,侵删)
这个函数通常出现在特定的编译器或开发环境中,最常见的是 Turbo C(一个非常古老的DOS环境C编译器),在嵌入式系统开发中,我们也常常自己编写类似的延时函数。
delay 函数的用法取决于你使用的开发环境,下面我将分两种情况来详细说明:
在Turbo C等老式编译器中使用(#include <dos.h>)
如果你正在使用像 Turbo C 或 Borland C++ 这样的编译器,那么你可以直接使用 delay 函数,它的原型定义在 dos.h 头文件中。
函数原型
void delay(unsigned int milliseconds);
功能
让程序暂停执行指定的毫秒数。

(图片来源网络,侵删)
参数
milliseconds: 一个无符号整型,代表你希望延迟的毫秒数。
返回值
无。
头文件
#include <dos.h>
示例代码
下面的代码会在控制台打印 "Hello!",然后暂停2秒(2000毫秒),再打印 "World!"。
#include <stdio.h>
#include <dos.h> // 必须包含这个头文件
int main() {
printf("Hello!");
// 暂停2000毫秒,也就是2秒
delay(2000);
printf(" World!\n");
return 0;
}
重要注意事项
- 精度问题:
delay函数的精度并不高,它依赖于系统的时钟中断,实际延迟时间可能比你设定的要长一些。 - 环境限制:这是DOS时代的产物,在现代的 Windows、Linux 或 macOS 环境下的标准C编译器(如 GCC、Clang、MSVC)中,无法使用这个函数,如果你尝试在 VS Code 或 Dev-C++ 中使用,会编译报错。
在现代开发环境(如嵌入式、Linux、Windows)中实现延时
在现代C语言开发中,我们需要自己实现延时功能,主要有两种方法:软件延时 和 硬件延时。
方法A:软件延时(不精确,简单易用)
这种方法通过执行一个空循环来消耗时间,从而达到延时的目的,精度取决于CPU的运行速度,所以是不可移植的。

(图片来源网络,侵删)
简单的空循环延时
最简单的延时就是一个 for 或 while 空循环。
void simple_delay(int milliseconds) {
// 这个循环的迭代次数需要根据你的CPU频率来调整
// 这是一个非常粗略的估计,在不同机器上效果完全不同
for (int i = 0; i < milliseconds * 1000; i++) {
// 空操作,什么也不做
}
}
缺点:延时时间不确定,CPU占用率高,不推荐在生产代码中使用。
使用 <unistd.h> (Linux/Unix/macOS) 和 <windows.h> (Windows)
更规范的方法是使用操作系统提供的API函数。
在 Linux/Unix/macOS 环境下:
使用 usleep 函数(微秒级延时)或 nanosleep 函数(纳秒级延时)。
- 头文件:
#include <unistd.h> usleep函数原型:int usleep(useconds_t useconds);(参数单位是微秒,1秒 = 1,000,000微秒)
#include <stdio.h>
#include <unistd.h> // Linux/macOS下的头文件
int main() {
printf("Hello!");
// 暂停2,000,000微秒,即2秒
usleep(2000000);
printf(" World!\n");
return 0;
}
在 Windows 环境下:
使用 Sleep 函数(注意首字母大写)。
- 头文件:
#include <windows.h> Sleep函数原型:void Sleep(DWORD milliseconds);(参数单位是毫秒)
#include <stdio.h>
#include <windows.h> // Windows下的头文件
int main() {
printf("Hello!");
// 暂停2000毫秒,即2秒
Sleep(2000);
printf(" World!\n");
return 0;
}
方法B:硬件延时(精确,常用于嵌入式系统)
在单片机(如STM32, Arduino, 51单片机)等嵌入式开发中,我们通常使用硬件定时器来实现精确的延时,这是最专业、最可靠的方法。
其基本原理是:
- 配置定时器:设置一个定时器,让它以某个固定的频率(每1微秒计数一次)向上计数。
- 启动定时器:启动定时器并让它从0开始计数。
- 等待中断/查询状态:程序可以进入低功耗模式等待定时器溢出中断,或者通过循环查询定时器的计数值是否达到预设值。
- 停止定时器:当达到预设的延时时间后,停止定时器,延时结束。
示例(概念性代码,以STM32 HAL库为例):
#include "stm32f1xx_hal.h" // 假设使用STM32 HAL库
// 使用硬件定时器精确延时1毫秒
void precise_delay_1ms() {
// 假设我们使用TIM2,并已提前配置好
__HAL_TIM_SET_COUNTER(&htim2, 0); // 计数器清零
HAL_TIM_Base_Start(&htim2); // 启动定时器
// 等待直到计数器达到1000(假设定时器配置为1us计数一次)
while (__HAL_TIM_GET_COUNTER(&htim2) < 1000);
HAL_TIM_Base_Stop(&htim2); // 停止定时器
}
这种方法的优点是非常精确,并且CPU在等待时可以进入睡眠模式,不消耗资源。
总结与对比
| 方法 | 精度 | 可移植性 | CPU占用 | 适用场景 |
|---|---|---|---|---|
Turbo C delay() |
低 | 差(仅DOS环境) | 高 | 学习历史代码,DOS游戏开发 |
空循环 for |
极差 | 差 | 高 | 不推荐,仅用于快速演示 |
usleep() / Sleep() |
高 | 好(需区分OS) | 低(可让出CPU) | 应用程序开发(桌面、服务器) |
| 硬件定时器 | 最高 | 差(依赖硬件) | 最低(可休眠) | 嵌入式系统、单片机开发 |
给你的建议:
- 如果你在做课程作业,老师要求用
delay:那很可能是在 Turbo C 环境下,直接#include <dos.h>然后调用即可。 - 如果你在做Windows桌面应用:使用
#include <windows.h>和Sleep()函数。 - 如果你在做Linux/Unix服务器或脚本:使用
#include <unistd.h>和usleep()函数。 - 如果你在做单片机或嵌入式开发:请务必学习并使用硬件定时器来实现延时,这是最规范、最可靠的做法。
