は私がutilA.cppに次のコードスニペットを持っています:utilA.h
がライン0にstruct tm
を使用しているためであると思われるこれはC++の前方宣言ですか?
error: variable 'xm::tm time1' has initializer but incomplete type
utilA.cppをコンパイルするときにGCCは文句
// utilB.h
namespace xm
{
void zoo(struct tm timeval); //<-----line 0
}
// utilA.cpp
#include <utilB.h> //<----line 1
#include <time.h> //<----line 2
namespace xm
{
void foo()
{
struct tm time1 = {0}; //<----line 3
}
}
、 time.h
は含まず、コンパイラは0行目のstruct tm
を前方宣言として扱います。したがって、0行目のヘッダの中にxm::tm
として解決されます。
したがって、C++標準では、struct tm
を関数宣言の型としてforward宣言として定義していますか?これを説明するのを助けて、標準からの引用符が役立つでしょう。
あなたのヘッダがそれに依存するので、あなたのヘッダに '#include'と書いてください。 –
molbdnilo
はい、utilB.hに#includeを追加する必要がありますが、これは巨大なプロジェクトのコードスニペットであるため、根本的な原因を見つける前に多くのことを混乱させました。 –
ZijingWu
これはプログラミングの非常に悪いスタイルです。それを無視します。 PS: '#include'-sを一番上に移動しようとしましたか? – i486