【问题标题】:Issues in C with including time.h?C 中包含 time.h 的问题?
【发布时间】:2013-08-15 18:08:20
【问题描述】:

我正在处理的这个大型项目中有一个名为 timeKeeper.h(和 .c)的文件

-------------编辑---------------修复了 BOOL 东西仍然坏掉了---------- ----

#ifndef TIMEKEEPER_H_
#define TIMEKEEPER_H_

#include <time.h>
#include <stdbool.h>

bool isAfter(time_t time);
void setTime(char seconds, char minutes, char hours, char day,
        char month, char year);
    void tickSeconds(void);
time_t getCurrentTime(void);
time_t createTime(char seconds, char minutes, char hours, char day,
        char month, char year);
void startTime(void);
time_t addSeconds(int seconds, time_t time);
long timeRemaining(time_t time);
void rtc_set(char seconds, char minutes, char hours, char days, char months,
    char year);
 #endif

当我尝试构建我的项目时,此文件(以及任何使用 time.h 的文件)中有一堆错误。以下是 timeKeeper.h 中的一些错误:

expected ')' before 'time'        Line 6
expected '"', ',', ';','asm', or '__attribute__' before 'getCurrentTime'    Line 10

我怀疑 timeKeeper 不知道 time_t 是什么,即使它有

#include <time.h>

我也遇到类似的错误

implicit declaration of function 'localtime'

在我的 timeKeeper.c 文件中。是的,timeKeeper.c #includes timeKeeper.h

非常感谢任何帮助。

----附加信息----- 我正在使用 Atmel Studio 6.0 这是timeKeeper.c

#include "FreeRTOS.h"
#include "task.h"
#include "print_funcs.h"

#include "timeKeeper.h"
#include "telemetryLookup.h"

void timeTask(void* pvParameters);

time_t TIME;
blah blah blah......

----编辑2-----

我在第 6 行添加了#include &lt;stdbool.h&gt; 并将Bool 更改为bool,但错误仍然存​​在。

【问题讨论】:

  • 这可能取决于包含tineKeeper.h之前包含的包含。在您的平台上使用最少的测试程序是否也会出现这些错误?顺便说一句:你的平台是什么?
  • 您可能会显示timeKeeper.cup 的开头,直到包括timeKeeper.h
  • 发布代码时,每行添加行号无济于事;我喜欢能够复制和粘贴代码并自己编译。如果您需要引用错误消息中的行号,请在该行添加 /* line 6 */ 之类的注释。
  • 好的,Keith,从现在开始我会这样做。
  • 正如 Keith 所说,将 Bool 更改为 bool

标签: c atmel time.h


【解决方案1】:

C 中没有类型 Bool。有一个类型 bool,但只有当你有 #include &lt;stdbool.h&gt; 时它才可见。

当我添加#include &lt;stdbool.h&gt; 并将Bool 更改为bool 时,您的代码编译不会出错。 (我还不得不删除行号。)

我还建议为isAfter 和其他函数的参数选择除time 以外的名称。 time 也是&lt;time.h&gt; 中声明的函数的名称。我不认为在这种情况下它实际上会导致冲突,但唯一的名称可以避免混淆。

因为Bool是一个无法识别的类型名,编译器会报语法错误

Bool isAfter(time_t time);

之后您看到的任何错误都可能是虚假的。如果遇到语法错误,请先修复最早报告的行上的错误,然后重新编译。

编辑:

根据进一步的 cmets,添加 #include &lt;stdbool.h&gt; 并将 Bool 更改为 bool 似乎没有帮助。您收到的特定消息似乎暗示time_t 未被识别——这当然不应该发生。

尝试一个简单的 2 行源文件(并确保文件名有 .c 后缀):

#include <time.h>
time_t foo;

如果失败,我能想到的唯一解释是您的编译器和/或运行时库安装以某种方式损坏。

您可以选择查看预处理的源代码吗?如果是这样,将其应用于上述 2 行源代码应该会显示 &lt;time.h&gt; 的预处理内容,其中应该包括 time_t 的定义。

【讨论】:

  • 我添加了#include &lt;stdbool.h&gt; 并将Bool 更改为bool,但我仍然遇到同样的错误。
  • @Personofblah:这很奇怪;我做了这些更改,并且头文件编译没有错误。如果你编译一个包含 only #include "timeKeeper.h" 的单行 .c 文件会发生什么?如果失败,请更新您的问题,向我们展示新的来源(但保留原件,因为这是我的回答所依据的)。
  • 你能推荐一个用于单文件编译的工具吗?据我所知,Atmel Studio 没有很好的方法来做到这一点。
  • @Personofblah:嗯,编译器?我对 Atmel Studio 一无所知。我想这是某种IDE。您可以执行类似右键单击源文件的操作来编译它吗?或者您可以暂时从您的timeKeeper.c 中删除除#include 之外的所有内容吗?
  • 愚蠢的我,你可以在 Atmel Studio 中右键单击 .c 文件,编译就在那里。无论如何,当空白 .c 文件具有 #include "timeKeeper.h" 时,会出现 5 个错误。其中两个是expected ')' before 'time' Line 6 and Line 15,其中三个是expected '"', ',', ';','asm', or '__attribute__' before SOMEFUNCTION
【解决方案2】:

(假设您使用符合标准的 C 编译器,并且我们正在处理微控制器,即独立环境。)

让我引用 C 标准:

符合的独立实现应接受任何严格符合的程序,该程序不使用复杂类型,并且库条款(第 7 条)中指定的功能的使用仅限于标准标题 &lt;float.h&gt;&lt;iso646.h&gt;&lt;limits.h&gt;&lt;stdarg.h&gt;@ 987654326@&lt;stddef.h&gt;&lt;stdint.h&gt;

&lt;time.h&gt; 的功能通常由操作系统提供,但微控制器不一定运行。因此,您可能需要自己提供此功能。


引用this thread

挑战:

damien_d - 2009 年 2 月 27 日 - 01:03 AM

发布主题: time.h 和/或 C 的计时库

我使用的是winavr 20081205。

似乎没有实现 time.h 头文件,无论是通过查看源代码,在主页上的 file:///C:/WinAVR-20081205/doc/avr-libc ... dules.html ,或者当我尝试在项目中包含头文件时。例如:

代码:

#include "time.h"

time_t testTime;

生成以下编译器错误:

代码:

../Clock/clock.c:4:18: error: time.h: No such file or directory ../Clock/clock.c:6: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'testTime'

make: *** [clock.o] Error 1

回复:

Koshchi - 2009 年 2 月 27 日 - 02:23 AM

帖子主题: RE:time.h 和/或 C 的计时库

引用: 似乎没有实现 time.h 头文件

当然没有。 time.h 中的功能处理运行代码的操作系统的功能。 AVR 没有操作系统。

引用: 或者任何 time_t 将在 avr-gcc 上定义。

这是问题的核心。系统上 time_t 的完整定义取决于操作系统。

致谢:

damien_d - 2009 年 2 月 28 日 - 06:03 AM

帖子主题: RE:time.h 和/或 C 的计时库

我今天学到了一些新东西 - 非托管 C 环境只需要标准头文件的一个子集。

猜猜是时候找到 time.h 的 BSD 许可版本(和实现)并将其破解为我的心脏内容了。

【讨论】:

  • 如果没有&lt;time.h&gt;,OP 会在#include &lt;time.h&gt; 上得到一个致命错误。提供&lt;time.h&gt; 但不定义time_t 会很奇怪。
【解决方案3】:

在第 6 行有一个Bool 的定义。也许你没有包含定义/Typedef ?

【讨论】:

    【解决方案4】:

    time() 是在time.h 中定义的函数,但您也尝试将其用作多个原型中的参数名称。

    【讨论】:

      猜你喜欢
      • 2011-12-22
      • 1970-01-01
      • 2016-05-04
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多