2015-12-07 15 views
5

Ho provato a cercare una buona risposta online ma non riescono a ottenerne una che possa comprendere appieno. Supponiamo che io sono un colpo di testa "add.h":Funzione inline nel file di intestazione in C

inline int add(int a, int b){ return a+b; } 

un file chiamato "adddouble.c":

#include "add.h" 

int adddouble(int a, int b){ return 2*add(a,b); } 

un file chiamato "addsquare.c":

#include "add.h" 

int addsquare(int a, int b){ return add(a,b)*add(a,b); } 

Un file principale "main.c":

#include<stdio.h> 

int adddouble(int, int); 
int addsquare(int, int); 
int main(){ 
printf("add double = %d\n", adddouble(10,20)); 
printf("add square = %d\n", addsquare(10,20)); 
return 0; 
} 

Io uso gcc5.2.0 per compilare quei file, ma ottenuto: "Simboli indefiniti per l'architettura x86_64:". Se aggiungo statico alla funzione inline in add.h o aggiungi dichiarazione "extern int add (int, int);" a "adddouble.c", compila correttamente senza errori. Sono nuovo alla funzione inline, non so come spiegare e capire questo comportamento. grazie

+1

Quali sono le opzioni di costruzione? A meno che non si costruisca in C99 o C11 non c'è il concetto di una funzione inline in C. – StoryTeller

+0

È necessario compilare il file di intestazione con gli altri file c o fornire sia .h che .c, add.h per il prototipo di add e Inserisci.c per il codice – qleguennec

+0

+1 Buona domanda. In realtà si collega bene con g ++, ma non riesco a farlo funzionare con gcc (-std = c11). Questi simboli add sono indefiniti (U) sia in addquare.o che adddouble.c. g ++ invece crea simboli deboli (W) per la funzione add ed è per questo che si collega. – PSkocik

risposta

6

Secondo http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf, Sembra linea funzioni si comportano in modo diverso in C e C++:

Qualunque funzione con collegamento interno può essere una funzione inline. Per una funzione con collegamento esterno, si applicano le seguenti restrizioni: Se una funzione è dichiarata con un identificatore di funzione in linea, allora deve essere definito anche nella stessa unità di traduzione. Se tutte le dichiarazioni dello scope del file per una funzione in un'unità di traduzione includono l'identificatore di funzione in linea senza extern, la definizione in quell'unità di traduzione è una definizione in linea. Una definizione in linea fa sì che non fornisca una definizione esterna per la funzione e che non sia vietare una definizione esterna in un'altra unità di traduzione. Una definizione in linea fornisce un'alternativa a una definizione esterna, che può essere utilizzata da un traduttore per implementare qualsiasi chiamata alla funzione nella stessa unità di traduzione . Non è specificato se una chiamata alla funzione utilizza la definizione in linea o la definizione esterna. 140)

Se non si inserisce static lì, si sta definendo una funzione inline con collegamento esterno senza creare un'istanza di definizione esterna.

extern int add(int, int); instace la definizione esterna per quella funzione e devi farlo esattamente una volta (non importa in quale file) per il collegamento per avere successo (oppure puoi contrassegnare la funzione inline static e il problema scompare).

(In C++ il inline crea deboli definizioni esterne in ogni unità di traduzione in modo da non dovete preoccuparvi di marcatura cose static o istanziare esattamente una definizione esterna per la funzione inline - g ++ dovrebbe semplicemente compilarlo con for f in *.c; do g++ -c "$f"; done; g++ *.o senza problemi.)

Problemi correlati