2011-08-12 16 views
7

私は元々はPC上に構築されたC++で多くのコードを持っています。私はObjective-CをMac上で動作させようとしています。そのために、C++コードを格納するObjective-Cフレームワークを作成し、薄いラッパーを追加しました。しかし、私はC++コードでtypedefの問題に遭遇しています。Objective-CでC++を使用すると、「競合する宣言 'typedef int BOOL'」をどのように修正できますか?

私はWinDef.hで定義されたBOOL変数を使用するPC上でC++で働いていました。だから、私がMac上ですべてを動かすと、typedef int BOOL;に追加して、BOOL変数が期待どおりにコンパイルされることを確認しました。

しかし、私はエラーを取得コンパイルしよう:「Conflicting declaration 'typedef int BOOL'を」。これは、BOOLがObjective-Cのキーワードであり、すでに定義されているためです。 Objective-C BOOLは、intではなく符号なしのcharであるため、使用することはできません。

私は定義取り消しのBOOLに言及し、私はそれを行う方法を見つけることができませんでした(またそれが実際に動作するか、私は知っています)oneを発見した可能な解決策を探していましたが。 Anotherは、の名前をBOOLのC++ファイルにキーワードではないものに変更します。他のプロジェクトがC++コードに依存しているので、この提案は私の選択肢ではありません。理想的には、私が行った変更は1つのファイルにとどまるか、少なくともWindowsマシン上のコードに悪影響を与えるべきではありません。

どのように私はC++のファイルのためのBOOLのObjective-Cの定義を未定義とC++の定義を使用することができます私が追加?この問題に対処するより良い方法はありますか?

ケースでは、私が使用しているのに役立ちます:Xcodeの3.2.5、64ビットおよびMac OS Xを任意の指導のための10.6.6

ありがとう!

+0

は、なぜあなたは最初の場所で 'BOOL'を使用しましたか? C++にはすでに 'bool'型があります。 –

+1

Windowsでは多くのAPIがWindowsによって定義されたBOOL型を使用するため、実際はintです。 BOOLと互換性がありません。特に、このAPIに渡す必要がある構造体の一部ではありません(Windowsではboolはバイトサイズで、BOOLは4バイトです)。 –

答えて

5

私は議論の一部で少し混乱しているが、その代わりにtypedef int BOOL;の方法についてはちょうど:あなたはtypedefを使用している場合、彼らは別物なので、その後#undefは動作しません

#ifndef BOOL 
    #define BOOL int 
#endif 

#define/#undefは置換を実行するプリプロセッサシンボルで動作しますが、typedefは別の型のエイリアスを作成する言語の一部です。それは単に置換を行う場合、それはもはやその定義を使用するように指示しないプリプロセッサ指示であるので

プリプロセッサシンボルは、任意の時点で未定義することができます。ただし、typedefは、プリプロセッサを使用して発生する線形処理ではなく、特定のスコープ内で作成されるため、未定義にすることはできません。 (同じように、グローバル変数int x;を宣言することはできず、コード内のある時点で、xを変数として認識しないようにすることができます。')

私の答えで#defineを提案する理由は、ObjectiveC #defineがコードの一部をコンパイルするときにのみヒットしている可能性があるということです。これは、なぜあなたがあなたのC++で、typedefを削除したときにエラーが出るかもしれないのかについての説明であるかもしれませんが、それが入っていればまだ矛盾します。しかし、仮定が正しいならば、それを定義するには、矛盾する定義が発生したときにそれらを避けることができます。

最終的な注記:この特定の状況では、を#defineの代わりに小切手に入れることもできます。しかし、私はそれが非常に一般的なイディオムであるため、またブロックが2回インクルードされた場合にC++コードで2回定義することを妨げるため、両方向と同じように処理するようになりました。おそらくどちらも非常に魅力的な理由ではないでしょう。あなたが非常に好きなのはtypedefです。それはコード上の問題ではないことを知っています。 :)

+0

:)おっと、私はあなたの問題がすでに解決された後に投稿しました。うまくいけばうれしいです! – shelleybutterfly

+0

私はあなたが言及した両方の方法を試しました( '#defdef BOOL int'と' typedef int BOOL; 'の内側に' #defdef'があります)。最初の方法はうまくいきましたが、2番目のメソッドは同じ 'Conflicting declaration'エラーを生成しました(私は完全に理解できません。代替ソリューションをありがとう! –

+0

ハァッ、それは非常に奇妙です。ああ、おそらくそれについてあまりにも懸命に考えることが最善であるそれらの事の1つ。 :Dとノートに感謝! ♡ – shelleybutterfly

0

私の知る限り、BOOLがあまりにもObjective-Cの中#defineです。あなたのタイプとそのタイプは必ずしも大きさや「符号の有無」には一致していないので、あなたの競合BOOLはあなたが

#undef BOOL 

に管理していても、定義に問題があります。あなたのBOOLは実際にはintでなければなりません。言い換えれば、あなたの#defineを省略し、単にObj-Cを使うことはできませんか?

+0

私のC++ファイルで 'typedef int BOOL'をコメントアウトすると、' BOOL'が使用されているときに、残りのC++ファイルにエラーが発生します。ですから、Obj-C BOOLの定義を代わりに使うことはできません。 –

+0

これはどのようにすることができますか?私はそれが一度だけ定義されることを望む。それを削除し、代わりに "objc.h"を含めてください。 FWIW、どのようなエラー? –

+1

ああ、私はそれが働いたと思います!少なくとも今はエラーを無料でコンパイルします。あなたが言ったことを '#include 'で追加しました。うまくいけば、ここから物事が消えてしまいます。ありがとうございました! FWIWは、 '' BOOL 'は型を指定せず、 '' ISO C++は ''型なしのBOOL' 'の宣言を禁じています。 –

0

時間が戻ったら、「自分のコードでtypedef int BOOLを使用しないでください」と言います。

あなたは実際にそれをやったことがありますが、あなたはちょっとしたピクルスに入っています。一般に、外部コードとのインタフェース以外は、自分のコードに外部データ型を使用しないでください。ターゲットとするすべてのプラットフォームで標準準拠のコンパイラを使用してコンパイルすることが保証されていることを前提として、標準の型は問題ありません。

最も前向きな解決策は、プラットフォームに依存しないコードのタイプとしてBOOLの使用を中止することです。その間に、すべての種類のプリプロセッサハッカーを使用してBOOLをコンパイルすることができますが、BOOLを同じ方法(#includes経由)でどこでも使用しないと、いくつかの奇妙なリンクエラーが発生する可能性があります。

0

私は

"error: conflicting declaration ‘typedef CARD8 BOOL’" 

でこの問題を持っていたし、私はこれを持っている人と私の解決策を共有するのが良いだろうと思った私はfreeimageライブラリをロードするためにcmakeのを使用して、私はKubuntuの14.x を使用しています問題!

Linux上FreeImageをインストール:

set(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY /usr/libs) 
find_path(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY, FreeImage.h) 
find_library(FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY, freeimage) 
include_directories(${FREEIMAGE_LIBRARY_AND_HEADER_DIRRECTORY}) 
target_link_libraries(freeimage) 

そして、私のmain.cppにして、私が持っている:

#include <FreeImage.h> 
#ifndef CARD8 
#define BYTE CARD8 
#define BOOL CARD8 
#endif 

そして、いくつかを私が持っている私のCMakeLists.txtファイルで

sudo apt-get install libfreeimage-dev 

をディスク上のOpenGlフレームをキャプチャするための特別なコード:

void generateImage(){ 
    int w, h; // get the width and height of the OpenGL window! 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    GLubyte * pixels = new GLubyte[3*w*h]; 
    glReadPixels(0,0,w,h,GL_RGB,GL_UNSIGNED_BYTE, pixels); 

    FIBITMAP * image = FreeImage_ConvertFromRawBits(pixels,w,h,3 * w, 24, 0x0000FF, 0xFF0000, 0x00FF00, false); 
    FreeImage_Save(FIF_BMP,image, "../img/text.bmp",0); 

    //Free resource 
    FreeImage_Unload(image); 
    delete[] pixels; 
} 

私はこれがこの問題を抱えている人に役立つことを願っています!

よろしく Kahin

関連する問題