2016-03-04 6 views
5

ich ein Stück C-Code wie das vor kurzem schrieb:Sollte ich daran denken, dass das Deklarieren aller statischen C-Funktionen eine gute Praxis ist?

static void func1() 
{ 

} 

static void func2() 
{ 

} 


typedef void (*func_t)(void); 

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

Eine andere Programmierer auf der gleichen Datei bearbeitet und verändert es an:

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() 
{ 

} 

Da die funcN Funktionen nur durch genannt werden In der Nachschlagetabelle brauche ich die Deklarationen dieser Funktionen eigentlich nicht.

Ist es Geschmackssache oder gibt es einen Codierungsstil, der als gute/schlechte Praxis angesehen wird?

Vielen Dank für Ihre Antworten!

+0

"Ich brauche nicht die Deklarationen" - Sie tun es immer noch! Ohne Sie können nicht tem in Ihrer Tabelle verwenden. Das Auslassen von "statischem" OTOH macht die _Deklaration_ extern nicht nur den Namen/das Symbol. – Olaf

+0

Es gibt vielleicht ein Vokabularproblem hier. Ist es besser, wenn ich sage "Ich brauche keine Prototypen"? Ich meine, wenn ich * die * Funktionen * deklariere * die gleichzeitig erklärt werden. Gehört das zu deinem Standpunkt? Was den letzten Teil Ihres Kommentars anbelangt: Bedeutet es, dass ohne den 'static' der Name/das Symbol öffentlich wäre? Wenn also dieser Name in einer anderen Übersetzungseinheit verwendet wird, würde die Kompilierung abgebrochen, weil der Body/die Implementierung (?) Nicht gefunden werden konnte. – Plouff

+0

1) Verwenden Sie '@ name', um einen Kommentar zuverlässig zu adressieren. Dein letzter Kommentar macht es mir nicht klarer. Vielleicht wird mein Originalkommentar deutlicher, wenn ich in der Mitte halte, dass ich dazu tendiere, das Standard-C-Vokabular zu verwenden. Schau es dir einfach an. Und Sie ** brauchen ** die Prototypen (die ** sind ** _declarations_). Und ohne 'static' hat ein im Dateibereich deklarierter Name _external linkage_. Der Begriff "öffentlich" wird vom Standard nicht verwendet (und hat eine andere Bedeutung, beispielsweise in C++). – Olaf

Antwort

3

Es ist in der Tat eine Frage des Geschmacks meist (und Codierung Stil ist immer irgendwie eine Frage der Meinung; der Stil Ihres Partners ist mit der Gewohnheit, den gesamten Code nach jeder anderen Definitionen setzen).

In der Praxis werden Sie besser sicherstellen, dass Ihre Funktionsnamen eindeutig sind (grep -ing für sie einfacher und gdb werden sie leichter finden) im gesamten Programm, auch wenn sie sichtbar sind oder nur im Inneren verwendet werden eine Übersetzungseinheit.

BTW, Ihre Funktionen sind nicht statisch, hat auch einige Vorteile. Unter Linux zum Beispiel sind die backtrace(3) & dladdr(3) Funktionen glücklicher mit global benannten Funktionen.

Auch, manchmal computed gotos und threaded code (oder sogar eine einfache große switch ....) sind schneller als ein Dispatch-Tabelle kurze Funktionen indirekt durch einen Zeiger aufrufen. (Der kleine Aufwand für das Aufrufen von Funktionen, beispielsweise das Ausführen ihres Prologs und Epilogs, könnte manchmal für einen kleinen und schnell laufenden Code von Bedeutung sein). Siehe Referenzen here & there.

+0

Es ist ratsam, sie statisch zu machen, da dadurch der globale Namensraum nicht verschmutzt wird. – Olaf

+0

Nicht immer. Einige Programme verwenden 'backtrace' (zB für einen Fehlerbericht in einem Interpreter), und dann ist es ratsam, alle Funktionen öffentlich zu haben (in diesem Fall haben Sie nur' statische Inline'-Funktionen, und der Rest sind globale Funktionen) –

+1

'Static Inline' ist eine andere Sache (beachten Sie, dass dies C ist).Wenn Sie mit dem Debuggen fertig sind, sollten Sie bestimmte Optimierungen sowieso nicht verwenden (für gcc verwenden Sie "-Og"). – Olaf

Verwandte Themen