次のコード チャンクの MacTypes.h の 2 行で typedef 再定義エラーが発生します。
#if __LP64__
typedef unsigned int UInt32;
typedef signed int SInt32;
#else
typedef unsigned long UInt32; // error here
typedef signed long SInt32; // error here
#endif
Clang エラーは、CFBase.h (CoreFoundation.framework 内) 内の次の以前の定義を指しています。
#if !defined(__MACTYPES__)
#if !defined(_OS_OSTYPES_H)
typedef unsigned char Boolean;
typedef unsigned char UInt8;
typedef signed char SInt8;
typedef unsigned short UInt16;
typedef signed short SInt16;
typedef unsigned int UInt32; // previous definition is here
typedef signed int SInt32; // previous definition is here
typedef uint64_t UInt64;
typedef int64_t SInt64;
typedef SInt32 OSStatus;
#endif
...
これは非常に奇妙__LP64__
です。Mac プラットフォームでは常に true であるように見えるため、なぜその typedef が評価されるのでしょうか? また、OS が提供する 2 つの定義が互いに矛盾するコンパイル パスがあるのはなぜですか?
編集: Xcode のエラーのスクリーンショットを次に示します。
<Carbon/Carbon.h>
クライアントの名前が含まれているため、インクルードするファイルのパスを空白にしました(ファイルは両方のエラーで同じです)。以下のフル パス名は次のとおりです (すべて Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks に含まれています)。
- Carbon.framework/Headers/Carbon.h:20
- CoreServices.framework/Headers/CoreServices.h:18
- CoreServices.framework/Frameworks/AE.framework/Headers/AE.h:20
- CoreServices.framework/Frameworks/CarbonCore.framework/Headers/CarbonCore.h:27
- CoreServices.framework/Frameworks/CarbonCore.framework/Headers/MacTypes.h:27
アップデート:
#include <Carbon/Carbon.h>
私自身のコードでは、次を追加する直前に:
#if __LP64__
#error Has LP64
#else
#error Doesn't have LP64
#endif
...そして、「LP64 がありません」というエラーが表示されるので、これが問題の原因のようです。ただし、Sublime Text 2 (SublimeClang を使用) で以下をコンパイルすると...
int main()
{
#if __LP64__
#error Has LP64
#else
#error Doesn't have LP64
#endif
return 0;
}
...「LP64あり」と出ます。プロジェクト テキスト検索を#define __LP64__
実行すると、プロジェクト内に何も見つかりません。検索__LP64__
すると、大量の#if
s と#ifdef
s が表示されます。このエラーの原因を知っている人はいますか?