【问题标题】:Why can't I use the nanosleep() function even when time.h is included?为什么即使包含 time.h 我也不能使用 nanosleep() 函数?
【发布时间】:2021-10-14 22:40:55
【问题描述】:

我正在关注this tutorial,它让你用 C 语言制作游戏。它使用 windows,我在 linux 上,所以已经存在一些兼容性问题 (conio.h)。我认为这是一个很好的挑战,所以我决定尝试“移植”它。

无论如何,我已经达到了我正在编写整个事情的逻辑的地步。我不能让它每秒刷新数百万次,所以我显然需要让它暂停一下。他们使用了 sleep() 但以某种方式传递了一个浮点数作为参数。谷歌说“不要使用睡眠,使用 usleep()!”手册页说“不要使用 usleep(),使用 nanosleep()!” k ._.

我创建了一个新文件并尝试使用它,但我被卡住了。 "独立声明无效"

#include <time.h>

int main(void)
 {
    struct timespec ts;
    {
       long tv_nsec = 10000000;
    }

     nanosleep(&ts, NULL);

     return 0;

【问题讨论】:

  • 您的代码缺少一个右括号,但我敢打赌它不在您的代码中。否则,不可能在我的机器上重现你的错误,一个 ubuntu 20
  • ts 后面有一个分号,然后您没有使用有效的语法来初始化结构。试试看:struct timespec ts = { .tv_nsec = 10000000L };
  • 您当前有一个声明变量 tv_nsec 的块,而 ts 未初始化。
  • 请在问题中包含来自编译器的确切错误消息(包括行号)。
  • 您可能需要在代码顶部(#include &lt;time.h&gt; 之前)定义一个feature test macro,例如#define _POSIX_C_SOURCE 199309L(值199506L200112L200809L 应该也可以工作)。

标签: c sleep


【解决方案1】:

您缺少头文件:

#include <stdio.h>

并且还定义了nsec:

ts.tv_nsec= 1000000 

这对我有用。

【讨论】:

    【解决方案2】:

    “独立声明无效”对我来说是新的,但你的代码肯定有缺陷。这……

        struct timespec ts;
        {
           long tv_nsec = 10000000;
        }
    
         nanosleep(&ts, NULL);
    

    ... 在调用 nanosleep() 时,变量 ts 的值完全不确定。特别是,long tv_nsec = 10000000 与变量ts 无关。它声明了一个名为tv_nsec 的单独变量,其范围仅限于包含该声明的块。

    您似乎想为ts 编写一个初始化程序。看起来更像这样:

        struct timespec ts = {
           .tv_nsec = 10000000
        };
    
        nanosleep(&ts, NULL);
    

    您还可以包含.tv_sec 的成员初始化程序(用逗号与另一个分隔符),但如果您希望将其初始化为零,则这是不必要的,例如在本例中。如果你提供了一个没有显式初始化所有成员的初始化器,那么那些没有显式初始化的会接收初始值 0(如果是算术)或NULL(如果是指针)。

    【讨论】:

      【解决方案3】:

      将 cmets 放在一起:

      #define _POSIX_C_SOURCE 199309L
      #include <time.h>
      #include <stdio.h>
      
      int main(void) {
          const struct timespec req = {
              .tv_sec = 0,
              .tv_nsec = 10000000,
          };
      
          if (nanosleep(&req, NULL) != 0) {
              perror("...");
              return -1;
          }
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-12-22
        • 2021-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多