1

最近、Mac OS で libfacebookcpp をコンパイルしていました。理解できない奇妙な使い方を見つけました。AuthorizedObject.hpp と List.hpp の 2 つのファイルがあります。ファイル AuthorizedObject.hpp の最後に、#include "List.hpp" という 1 行があります。これで、正常にコンパイルできました。しかし、その行を先頭に移動すると、エラーが発生します。コードの骨組みは次のとおりです。

//AuthorizedObject.hpp
class AuthorizedObject
{
public:
... 
template<class TType>
void _GetConnection(const ::std::string& uri, List<TType> *list) const
{
    LIBFACEBOOKCPP_CHKARG(list);

    Json::Value value;
    request_->GetResponse(uri, &value);

    list->Deserialize(*this, value);
}
...
}
#include "List.hpp" //end

----------------------------------------------------------
//List.hpp 
#include "AuthorizedObject.hpp"
class LIBFACEBOOKCPP_API List : public AuthorizedObject
{
private: // private classes
...
}

その行(#include "List.h")をAuthorizedObject.hppの先頭に置くと、2つのファイルは円で互いにインクルードされると思います。したがって、コンパイラはコンパイル方法を知りません。しかし、その行を最後に置くと、この問題は解決しますか? なんで?前もって感謝します。

4

2 に答える 2

1

違いは、クラス/関数/...が定義される順序です。たとえば、次のようになります。

#include "one.h"
void foo(bar &);

// Will result into:
class bar {};
void foo(bar&);

これは有効なコードです。一方で:

void foo(bar &);
#include "one.h"

// Will result into statements in different order:
void foo(bar&);
class bar {};

class barこれは、宣言される前に使用することを意味するため、エラーになります。また、宣言が 2 回処理されないようにする必要がある場合もあります ( UmNyobe は既に部分的に説明しています)。

#if !defined( MY_HEADER_INCLUDED_)
# define MY_HEADER_INCLUDED_
// Complete content goes here
#endif /* !defined( MY_HEADER_INCLUDED_) */

この方法では、初めてファイルをインクルードするときにMY_HEADER_INCLUDED_定義されません (コンテンツはコード内に「配置」されます)。2 回目 (円に含めます)MY_HEADER_INCLUDED_が定義されるため、ボディ全体がスキップされます。

于 2012-11-14T09:56:13.843 に答える
1

そうです、それが問題です。コンパイラがコンパイル方法を知らないのは間違っています-そうです、あなたはそれを間違って使用しているだけです:)。

の先頭にあるインクルードガード (インクルード ガードまたはディレクティブAuthorizedObject.hppがあると仮定します) が定義されます(または同様のもの)。その後、 をインクルードすると、ヘッダーがインクルードされます。インクルード ガード マクロは既に定義されているため、 の定義はスキップされ、タイプについてはわかりませんが、それを使用するため、エラーが発生します。#pragma onceAUTHORIZED_OBJECT_HList.hAuthorizedObject.hppAuthorizedObjectList

インクルードを最後に移動すると、 の定義AuthorizedObjectはすでにコンパイラによって処理されているため、内部で使用することList.hは有効です。

于 2012-11-14T09:56:37.783 に答える