2016-03-04 17 views
5

Recentemente ho scritto un pezzo di codice C così:Dovrei considerare che dichiarare tutte le funzioni statiche C è una buona pratica?

static void func1() 
{ 

} 

static void func2() 
{ 

} 


typedef void (*func_t)(void); 

const func_t lookUpTable[FUNC_COUNT] = 
{ 
    [FUNC1] = &func1, 
    [FUNC2] = &func2 
} 

Un altro programmatore ha lavorato sullo stesso file e lo cambiò in:

static void func1(); 
static void func2(); 

typedef void (*func_t)(void); 

const func_t lookUpTable[FUNC_COUNT] = 
{ 
    [FUNC1] = &func1, 
    [FUNC2] = &func2 
} 

static void func1() 
{ 

} 

static void func2() 
{ 

} 

Dal momento che i funcN funzioni vengono chiamate solo tramite la tabella di ricerca, in realtà non ho bisogno delle dichiarazioni di quelle funzioni.

È una questione di gusto o esiste uno stile di codifica considerato una buona/cattiva pratica?

Grazie per le vostre risposte!

+0

"In realtà non ho bisogno delle dichiarazioni" - Lo fai ancora! Senza di te non puoi usare tem nella tua tabella. Omettere 'static' OTOH non rende _declaration_ extern, solo il nome/simbolo. – Olaf

+0

C'è forse un problema di vocabolario qui. È meglio se dico "Non ho bisogno dei prototipi"? Intendo quando * definisco * le funzioni che sono * dichiarate * allo stesso tempo. Fa parte del tuo punto? Riguardo l'ultima parte del tuo commento: significa che senza 'static', il nome/simbolo sarebbe pubblico. Quindi, se questo nome viene utilizzato in un'altra unità di traduzione, la compilazione si interrompe perché non è stato possibile trovare il corpo/implementazione (?)? – Plouff

+0

1) usare '@ nome' per aggiungere un commento in modo affidabile. Il tuo ultimo commento non mi rende più chiaro. Forse il mio commento originale diventa più chiaro mantenendo a metà che tendo ad usare il vocabolario standard di C. Basta dare un'occhiata. E tu ** fai ** bisogno dei prototipi (che ** sono ** _declarations_). E senza 'static', un nome dichiarato a scope-scope ha _esterno linkage_. Il termine "pubblico" non è usato dallo standard (e ha un significato diverso, ad esempio in C++). – Olaf

risposta

3

È davvero una questione di gusti per lo più (e lo stile di codifica è sempre in qualche modo una questione di opinione, lo stile del tuo partner è coerente con l'abitudine di mettere tutto il codice dopo ogni altra definizione). In pratica, è meglio assicurarsi che i nomi delle proprie funzioni siano univoci (rende più semplice grep -ing e gdb li troverà più facilmente) nell'intero programma, anche se sono visibili o utilizzati solo all'interno del programma. un'unità di traduzione.

BTW, avere le tue funzioni non statiche ha anche alcuni vantaggi. Ad esempio, su Linux, le funzioni sono più felici con le funzioni con nomi globali.

Inoltre, a volte computed gotos e threaded code (o anche una semplice grande switch ....) sono più veloci di un dispaccio tavolo chiamando brevi funzioni indirettamente attraverso un puntatore. (Il piccolo sovraccarico delle funzioni di chiamata, ad esempio l'esecuzione del prologo e dell'epilogo, potrebbe a volte importare codice minuscolo e veloce). Vedi riferimenti here & there.

+0

Rendendoli 'statici è ancora una buona pratica, in quanto evita di inquinare lo spazio dei nomi globale. – Olaf

+0

Non sempre. Alcuni programmi usano 'backtrace' (ad es. Per la segnalazione di errori in un interprete), quindi avere tutte le funzioni pubbliche è saggio (in tal caso, si avranno solo funzioni' 'inline' statiche 'e il resto funzioni globali) –

+1

'static inline' è una questione diversa (nota questa è C).Se hai bisogno di eseguire il debug, non dovresti comunque utilizzare alcune ottimizzazioni (per gcc usa '-Og'). – Olaf