2014-10-13 12 views
6

Was ist "passender" beim Schreiben eines Linux-Kernel-Moduls: Mit static const eine Konstante zu definieren, oder #define?Linux Kernel: Statisch Const vs #Definieren

Ich habe ein Kernel-Modul in Bezug auf ein Stück Hardware, und ich habe eine typische Konstante, die die Anzahl der Puffer ist. Anstatt "3" überall fest zu programmieren, möchte ich eine Konstante verwenden. C-Stil empfiehlt normalerweise, static const zu nehmen, aber ich bemerke, dass der Kernel voll von #define ist überall an der Stelle ist. Gibt es einen Grund?

+1

http://stackoverflow.com/questions/1674032/static-const-vs-define-in-c –

+0

Ja, ich habe das gelesen .. Ich frage mich nur, ob es andere Auswirkungen gibt, wenn Sie in der arbeiten Kernel-Space, der die Antworten leicht ändert. – Yeraze

+1

Befolgen Sie die Regeln des Projekts, an dem Sie gerade arbeiten. Da Linux #define für Hardware-Masken/-Register/-Werte bereits verwendet, verwenden Sie die gleiche Konvention. – nos

Antwort

3

Früher war es so, dass Sie nicht tun konnte:

const size_t buffer_size = 1024; 
unsigned char buffer[buffer_size]; 

in C, da buffer_size nicht eine "echte" konstant ist. Daher sehen Sie oft

#define BUFFER_SIZE 1024 
unsigned char buffer[BUFFER_SIZE]; 

statt.

Ab C99, Sie können die ehemalige, aber nicht in globalen Bereich. Es funktioniert nicht außerhalb einer Funktion (nicht einmal wenn es gemacht wird static). Da viel Code im Kernel mit ähnlichen Konstrukten arbeitet, könnte das ein Grund sein, stattdessen den Präprozessor zu verwenden.

Hinweis: Vergessen Sie nicht über sizeof, es ist ein sehr gutes Werkzeug, wenn es darum geht, die Größe Konstante nicht überall zu wiederholen, unabhängig davon, wie die Konstante implementiert wurde.

+0

Ja, ich kenne sizeof .. Leider ist diese Konstante durch externe Hardware-Anforderungen definiert, und muss a-priori bekannt sein (ich kann nicht nach dieser Nummer fragen, es muss nur bekannt sein, 3 zu sein). – Yeraze