2017-03-20 5 views
1

私はClangを使用してソースからをビルドしています。私は次のエラーを取得する:なぜカランはカイロ紛争でこれらのタイプを考えるのですか?

src/cairo-quartz-font.c:368:1: error: conflicting types for 'cairo_quartz_font_face_create_for_cgfont' 
cairo_quartz_font_face_create_for_cgfont (CGFontRef font) 
^ 

src/cairo-quartz-font.c:247:18: note: previous implicit declaration is here 
*font_face = cairo_quartz_font_face_create_for_cgfont (cgFont); 

しかし、ソースを見て、私はこれらの定義を見つける:

247:

CGFontRef cgFont = NULL; 
// ... 
*font_face = cairo_quartz_font_face_create_for_cgfont (cgFont); 
CGFontRelease (cgFont); 

368:

cairo_font_face_t * 
cairo_quartz_font_face_create_for_cgfont (CGFontRef font) 
{ 
    cairo_quartz_font_face_t *font_face; 
    // ... 

完全なソースをmirrored hereです。

ここでタイプの競合はありますか?

答えて

2

機能cairo_quartz_font_face_create_for_cgfontを247行目で使用すると、宣言されていません(-Wallを使用しない限り警告が表示されます)。したがって、コンパイラは仮定された戻り値の型をintとします。

最後に関数を宣言すると、戻り値の型はintではありません。それは型の衝突です。

通常、この種の問題は、関数プロトタイプのヘッダーを使用することで回避できます。

+1

また、同じ変換単位で定義されている関数を呼び出す場合は、この場合のように、呼び出しの前に定義が表示されていれば十分です。また、特に静的関数や他の翻訳単位から呼び出されない関数の場合、関数の宣言をソースファイルに直接呼び出す前に、その宣言をソースファイルに直接置く方が適切かもしれません。 –

+1

はい、宣言がありませんでした。ヘッダファイルでは、関数はフラグ 'CAIRO_HAS_QUARTZ_FONT'がセットされている場合にのみ宣言されます。これをコマンドラインでコンパイラに渡すと、問題が解決されました。 – sdgfsdh

関連する問題