-2

私が取り組んでいるこの大規模なプロジェクトには、timeKeeper.h (および .c) というファイルがあります。

--------------編集--------------- BOOL THINGがまだ壊れていたのを修正--- -

#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 #include 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 <stdbool.h>して変更Boolboolましたが、エラーはまだ残っています。

4

4 に答える 4

5

BoolC にはtype はありません。 type はありますがbool、 がある場合にのみ表示されます#include <stdbool.h>

に追加#include <stdbool.h>して変更Boolするboolと、コードはエラーなしでコンパイルされます。(行番号も削除する必要がありました。)

timeパラメータ toisAfterやその他の関数以外の名前を選ぶこともお勧めします。timeで宣言された関数の名前でもあり<time.h>ます。この場合、実際に競合が発生するとは思いませんが、一意の名前は混乱を回避します。

Boolは認識されない型名であるため、コンパイラは構文エラーを報告します

Bool isAfter(time_t time);

その後に表示されるエラーは、偽物である可能性があります。構文エラーが発生した場合は、最初に報告された行のエラーを修正してから、再コンパイルすることから始めます。

編集:

さらなるコメントに基づいて、追加#include <stdbool.h>および変更Boolbool役に立たないようです。そして、あなたが受け取っている特定のメッセージは、それtime_tが認識されていないことを暗示しているようです - これは確かに起こってはいけません.

単純な 2 行のソース ファイルを試してください (ファイル名に.cサフィックスがあることを確認してください)。

#include <time.h>
time_t foo;

それが失敗した場合、私が考えることができる唯一の説明は、コンパイラやランタイム ライブラリのインストールが何らかの理由で破損しているということです。

前処理されたソースを表示するオプションはありますか? その場合、上記の 2 行のソースに適用すると、前処理された の内容が表示<time.h>され、 の定義が含まれているはずですtime_t

于 2013-08-15T18:14:37.473 に答える
2

(標準に準拠した C コンパイラを使用し、マイクロコントローラ、つまり独立した環境を扱っていると仮定します。)

C標準を引用しましょう:

準拠する独立した実装<float.h>は、複雑な型を使用せず、ライブラリ句 (句 7) で指定された機能の使用が標準ヘッダー 、、、、、、、およびの内容<iso646.h>に限定される厳密に準拠するプログラムを受け入れるものとします。<limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>

の機能<time.h>は通常、オペレーティング システムによって提供されますが、マイクロコントローラが実行するとは限りません。そのため、この機能を自分で提供する必要がある場合があります。


このスレッドを引用します。

チャレンジ:

damien_d - 2009 年 2 月 27 日 - 午前 1 時 3 分

投稿の件名: C の time.h および/またはタイミング ライブラリ

winavr 20081205 を使用しています。

ソースを見るか、 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

応答:

コシチ- 2009 年 2 月 27 日 - 午前 2 時 23 分

投稿の件名: RE: C の time.h および/またはタイミング ライブラリ

引用: time.h ヘッダー ファイルが実装されていないようです

もちろんありません。time.h の機能は、コードが実行されているオペレーティング システムの機能を処理します。AVR にはオペレーティング システムがありません。

引用: またはtime_tがavr-gccで定義されるものは何でも。

これが問題の核心です。システム上の time_t の完全な定義は、OS に依存します。

了承:

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

投稿の件名: RE: C の time.h および/またはタイミング ライブラリ

今日、私は何か新しいことを学びました。ホストされていない C 環境では、標準ヘッダーのサブセットのみが必要です。

time.h の BSD ライセンス バージョン (および実装) を見つけて、心ゆくまでハックする時が来たと思います。

于 2013-08-16T07:11:04.900 に答える
0

at 6 行目に の定義がありBoolます。definition/Typedef を含めていないのではないでしょうか?

于 2013-08-15T18:13:35.887 に答える