在 C 语言编程中,有时候我们需要让程序停顿一下,等一等再继续执行,此时就需要用到 “延时函数” 了。
不过 C 语言标准库并没有统一的延时函数,因此在 Windows 系统和 Linux/macOS 系统下,我们需要使用不同的头文件和函数。这一点初学者非常容易踩坑,小伙伴们一定要注意区分。
常用的延时函数
根据操作系统的不同,常用的延时函数主要分为以下 2 类。
1. Windows 系统
在 Windows 下,我们需要引入 <windows.h> 头文件,然后使用 Sleep() 函数。
语法:
#include <windows.h>
Sleep(毫秒数)说明:
注意,Sleep() 函数中的 “S” 是大写的。其中,Sleep(1000); 表示延时 1 秒。
2. Linux / macOS 系统
在 Linux 或 macOS 下,我们需要引入 <unistd.h> 头文件,常用的函数有 sleep() 和 usleep() 这两个。
语法:
#include <unistd.h>
sleep(秒数)
usleep(微秒数)说明:
usleep() 用于实现更精准的延时。其中,sleep(1); 表示延时 1 秒,而 usleep(1000000); 表示延时 1 秒。
C 延时函数示例
为了让代码能够在不同的电脑上都能运行,在实际开发中我们一般会先使用 “预处理指令(#ifdef)” 来判断当前操作系统,然后再选择正确的头文件和函数。
示例 1:跨平台的延时程序
#include <stdio.h>
// 根据操作系统引入不同的头文件
#ifdef _WIN32
#include <windows.h> // Windows 系统
#else
#include <unistd.h> // Linux/macOS 系统
#endif
int main(void)
{
printf("开始倒计时...\n");
printf("3\n");
// 根据操作系统调用不同的函数
#ifdef _WIN32
Sleep(1000); // Windows: 单位是毫秒,1000ms = 1s
#else
sleep(1); // Linux: 单位是秒
#endif
printf("2\n");
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
printf("1\n");
#ifdef _WIN32
Sleep(1000);
#else
sleep(1);
#endif
printf("出发!\n");
return 0;
}运行结果如下(每隔 1 秒打印一行)。
开始倒计时...
3
2
1
出发!分析:
在这个例子中,我们使用了 #ifdef _WIN32 来判断当前是否是 Windows 系统。
- 如果是 Windows,则程序会包含
<windows.h>并调用 Sleep(1000)。 - 如果是 Linux 或 macOS,则程序会包含
<unistd.h>并调用 sleep(1)。
这种写法虽然看起来稍微复杂一点,但它具有很好的可移植性,无论在谁的电脑上跑都不会报错。
示例 2:在循环中使用延时
#include <stdio.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
int main(void)
{
char* colors[3] = {"红灯", "黄灯", "绿灯"};
// 模拟交通信号灯
for (int i = 0; i < 3; i++)
{
printf("当前状态:%s\n", colors[i]);
// 延时 2 秒
#ifdef _WIN32
Sleep(2000);
#else
sleep(2);
#endif
}
return 0;
}运行结果如下。
当前状态:红灯
(等待 2 秒...)
当前状态:黄灯
(等待 2 秒...)
当前状态:绿灯分析:
在这个例子中,我们利用 for 循环 遍历字符串数组,然后配合延时函数,来模拟了一个简单的交通信号灯切换效果。如果没有延时函数,这三行字会瞬间打印出来,就看不到 “切换” 的过程了。
最后,我们再强调一下单位换算,小伙伴们千万别搞错了:
- Windows Sleep():毫秒。其中,Sleep(1000) = 1 秒。
- Linux sleep():秒。其中,sleep(1) = 1 秒。
- Linux usleep():微秒。其中,usleep(1000000) = 1 秒。
