【问题标题】:Can't get different compilers to use specific header files?不能让不同的编译器使用特定的头文件?
【发布时间】:2014-02-07 14:35:45
【问题描述】:

我正在为大学写一个 C 项目,我想在我的头文件中使用Sleep() 函数。标记它的人可能正在使用 Linux,我正在为 Windows 开发 VS2013。我发现 Sleep() 存在于两个不同的头文件中,具体取决于编译器是使用 Windows 还是 Linux,我查看了网络并找到了在预处理器中使用 "#ifdef" 的建议。但是我是预处理器工作的新手,所以当有很多不同的建议时我不确定该使用什么,我特别不确定这些建议是否与我的目的相同,所以如果这是一个常见的问题,我深表歉意问题。我尝试了以下方法:

#ifdef _WIN32 || _WIN64
#include<windows.h>
#elif __linux
#include<unistd.h>
#else
#include<unistd.h>
#endif

这在 VS2013 中编译得很好,但我在 linux 机器上遇到Sleep() 的错误,所以我使用的代码似乎在 VS2013 之外无法工作。有人能解释一下为了让 Windows 和 Linux 使用它们各自的头文件需要指定什么吗?

【问题讨论】:

  • sleep() 已定义,但我不认为 Sleep() 已定义(在 linux 上)..
  • 注意 windows Sleep 需要毫秒作为参数,而 unistd 需要秒作为参数。

标签: c linux c-preprocessor


【解决方案1】:

Linux 函数名为 sleep(),小写,但 Windows 函数名为 Sleep(),带有大写 S。C 区分大小写。此外,Windows Sleep() 将参数以毫秒为单位,而 Linux 替代方案使用秒。

所以需要这样的东西:

#ifdef _WIN32 || _WIN64
#include<windows.h>
#define sleep(x) Sleep((x) * 1000)
#elif __linux
#include<unistd.h>
#else
#include<unistd.h>
#endif

或者,如果您愿意,也可以反过来做,但会遇到精度问题。 (如果有问题,请考虑使用nanosleep())。

【讨论】:

  • 感谢您的建议,因为我说我不使用 Linux,所以我不知道 unistd.h 版本的格式,但是我明天会在 Linux 系统上测试一下然后回答这个问题。
猜你喜欢
  • 2013-10-28
  • 2011-02-27
  • 2016-01-28
  • 2016-09-04
  • 2014-12-22
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多