2016-04-07 5 views
0

純粋な仮想メソッドを定義したシンプルでわかりやすいのヘッダーファイルがいくつかあります。コードはVisual Studio 2015でWindows上で正常にコンパイルされますが、GCCは固まっています。まず、コード:インポートされたヘッダーファイル、interface関数属性にマクロを使用すると、GCC - "初期化子は不完全な型です"というエラーが発生する

コード表示


namespace CustomUtils 
{ 
    interface API_ABSTRACT overriden 
    { 
     virtual int GetStatus() const = 0; 
    }; 
} 

はちょうどstuctのように定義される:

#define interface struct 
API_ABSTRACT

そしてだけですマクロfor nothing:

#define API_ABSTRACT 

interfacetypedefは、私は何のコントロールの上に持っていない継承されたコードの一部であり、私はWindowsとLinuxでのdefine custom attributesは私がエクスポートたAPI機能を制限することができるようにAPI_ABSTRACTが整備されています。私は、行を変更した場合


error: variable 'API_ABSTRACT CustomUtils::overridden' has initializer but incomplete type 

::これはVS2015でビルドしますが、Linux上で、私は、ビルドエラーを取得するために

interface API_ABSTRACT overriden 

を私はそれが翻訳されていると推定:

struct overriden 

コードはLinuxでうまくコンパイルされます。私はgcc -E -dDでコンパイルを試みて、 "前処理済み"のソースをtypedef#defineの置換を見るためにスクリーンにレンダリングしましたが、.cppファイルの出力のみを表示し、ヘッダ(.h)ファイルは表示していないようです。

質問

ないのはなぜGCCでコンパイルしようとすると、このコードは動作しますか?

ありがとうございます。


編集#1


gcc -Eからの出力は、問題の行があることを示しています

struct API_ABSTRACT overriden 

は、だから、犯人は何もないと評価されたマクロAPI_ABSTRACT、あるようです。

+0

* interfaceはstruct *にtypedefedされていますか? – SergeyA

+0

@SergeyA更新された質問を参照してください。 30秒後に更新されます。 – DevNull

+0

'typedef struct interface;'は有効なC++コードではありません。 – SergeyA

答えて

1

API_ABSTRACTはどこにも定義されていませんでした(対応するファイルは含まれていません)。それを確認する方法はTELL-物語gcc -E経由さ:-E

struct API_ABSTRACT overriden 

、gccが前処理された出力を示し、ありふれた風景の中にAPI_ABSTRACTを持つことがプリプロセッサはそれの何も知らないことを意味します。 C++コンパイラは、この構築物(struct API_ABSTRACT overriddenを)見てきました

、それはoverridenはタイプAPI_ABSTRACTの変数であること(文法に従って、あなたがコンパイラの認識を付与した場合)と思いました。中括弧の後には、その変数を初期化するための構造体がありました。しかし、API_ABSTRACT型は決して定義されていないので、コンパイラは不完全型の変数を初期化することに不満を抱いていました。

+0

ありがとう。しかし、質問:コンパイラがあまりあいまいな警告を出さないのはなぜですか?つまり、 'API_ABSTRACT'が定義されていませんか? – DevNull

+1

@Dogbert、コンパイラはあなたの意図を推測し、メッセージを調整するのに最善を尽くしますが、文法が残虐に違反するのは難しいです。 – SergeyA

+0

もう一度お世話になりました! – DevNull

関連する問題