2017-03-20 3 views
1

Ich baue aus der Quelle mit Clang. Ich erhalte den folgenden Fehler:Warum denkt Clang diese Typen in Kairo Konflikt?

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); 

jedoch an der Quelle suchen, finde ich diese Definitionen:

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; 
    // ... 

Die vollständige Quelle ist mirrored here.

Was ist der Typ Konflikt hier?

Antwort

2

Wenn Sie die Funktion cairo_quartz_font_face_create_for_cgfont in Zeile 247 verwenden, ist sie nicht deklariert (Sie sollten eine Warnung erhalten, wenn Sie nicht -Wall verwenden). Der Compiler füllt also einen angenommenen Rückgabetyp von int aus.

Wenn Sie die Funktion schließlich deklarieren, ist der Rückgabetyp nicht int. Das ist ein Typkonflikt.

Normalerweise würde diese Art von Problem durch #include vermieden werden, eine Kopfzeile mit den Funktionsprototypen.

+1

Wenn Sie eine Funktion aufrufen, die in derselben Übersetzungseinheit wie in diesem Fall definiert ist, reicht es alternativ aus, dass die Definition vor allen Aufrufen angezeigt wird. Auch und insbesondere für statische Funktionen und andere, die nicht von anderen Übersetzungseinheiten aufgerufen werden, ist es möglicherweise sinnvoller, eine Deklaration der Funktion direkt in die Quelldatei einzufügen, bevor sie aufgerufen wird. –

+1

Ja, es war eine fehlende Erklärung. In der Header-Datei wird die Funktion nur deklariert, wenn das Flag 'CAIRO_HAS_QUARTZ_FONT' gesetzt ist. Wenn Sie dies an den Compiler in der Befehlszeile übergeben, wurde das Problem gelöst. – sdgfsdh

Verwandte Themen