0

コードは Debian 5 システムではエラーなしでコンパイルされますが、FreeBSD 7 ではたとえば 98 行目で構文エラーが発生するため、これは非常に不可解です。

int ipmi_fru_get_board_info_mfg_time(ipmi_fru_t   *fru, time_t *time);

元々、*fru と time_t の間には改行がありました。これらのコンパイラ エラーの原因は不明ですが、改行について言及することは重要だと感じました。

または、これは 298 行目で、形式がまったく変更されていません。

int ipmi_fru_get(ipmi_fru_t                *fru,
     int                       index,
     char                      **name,
     int                       *num,
     enum ipmi_fru_data_type_e *dtype,
     int                       *intval,
     time_t                    *time,
     char                      **data,
     unsigned int              *data_len);

これらは、端末に出力される変更されていないエラーです。

In file included from out_fru.c:37:
../include/OpenIPMI/ipmi_fru.h:98: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:298: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:474: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:559: error: expected declaration specifiers or '...' before 'time_t'
../include/OpenIPMI/ipmi_fru.h:627: error: expected declaration specifiers or '...' before 'time_t'

後続のエラーは、ipmi_fru.h ヘッダー ファイルの上記の行で宣言された関数に影響するため、関連しているようです。

out_fru.c: In function 'ipmi_cmdlang_dump_fru_info':
out_fru.c:87: warning: passing argument 7 of 'ipmi_fru_get' from incompatible pointer type
out_fru.c:87: warning: passing argument 8 of 'ipmi_fru_get' from incompatible pointer type
out_fru.c:87: error: too many arguments to function 'ipmi_fru_get'

これらの奇妙なプラットフォーム固有の構文エラーの原因は何ですか? 私の最初の考えは印刷できない文字でしたが、 cat -e include/OpenIPMI/ipmi_fru.h | で確認してみました。以下、スペースと改行だけが表示されます。

4

3 に答える 3

1

このような不可解なエラーの場合、自分でプリプロセッサを実行して結果を確認するのが最善の方法です。ヘッダーのどこかにトークンが#define含まれている場合があり、何が起こっているのかを知ることがほとんど不可能になります。

これを行うには、この .c ファイルのコンパイル行を見つけて、次のように実行します。

cpp <all -I switches from the compilation line> <all -D switches> yourfile.c outfile.tmp

関連する行を探してみてくださいoutfile.tmp- 少し面倒に見えるかもしれませんが、元のファイル名と行番号を検索してください - それほど難しいことではありません。その行が見つかったら、実際の問題を特定するのがそれほど難しくないことを願っています。

于 2010-07-15T09:52:08.633 に答える
1

あなた/元の作成者はtime_t、コンパイルが成功したときに定義されたヘッダーを含むファイルを含めたに違いありません。ただし、問題の正しい解決策を知るには、そのファイルを正しく見つける必要があります。

プログラミングのすべての基本を揺るがすファイルをLinuxに含める必要がないと仮定することはできません:)。

于 2010-07-15T14:03:15.587 に答える
0

ユーザー Praveen は私の質問によく答えてくれましたが、スレッドを未回答のままにしないように、私が発見したことについて言及します。

ソフトウェアは独自の time_t を定義しているようです。それか Linux では、time_t データ型に time.h を含める必要はありません。

いずれにしても、FreeBSD に time.h をインクルードするだけで移植を続けることができました。

于 2010-07-15T10:05:13.983 に答える