[C]Globale Variablen markieren

Herakles

Profifragensteller
Moin!

Ich verwende in meinen Projekten hin und wieder - eben da wo es nicht anders geht - globale Variablen. Die fasse ich dann meist in einem struct zusammen, etwa so:

Code:
struct globals {
   int furz;
   int noch_ein_furz;
} global;

So sehe ich überall im Code, wenn ich drauf zugreife, dass die Varibale, mit der ich da gerade arbeite, eine globale ist:

Code:
if( global.furz > 1 ) stinken++;

Wenn ich nun aber eine Variable habe, die nicht global für alle im Projekt involvieren Dateien habe, sondern nur für die eine spezielle Datei, dann hätte ich da auch gern eine Unterscheidung, anhand der ich direkt erkennen kann, dass das eben keine lokale Variable der Funktion ist, sondern eben eine globale. In mein "struct globals" gehört das aber auch nicht rein, weil die Variable eben nicht für das gesamte Projekt "global" ist, sondern nur für die eine Quellcode-Datei.

So, gibt es dazu eine allgemeingültige Konvention, an die man sich halten könnte? Wie markiert Ihr Eure "Besonderen" Variablen?

Bin gespannt auf Vorschläge...

Viele Grüße
Herakles
 
baeh!
globale variablen. igittigit ;)

ich mach das ganze immer ueber handles. ein struct, in dem alle variablen stehen die man so braucht, und die wird dann an alle funktionen uebergeben.
ist praktisch das gleiche, mit dem unterschied dass die alle sauber auf dem heap oder im stack landen.

Code:
typedef struct _tHandle
{
 int a;
 int b;
 int c;
} tHandle;

void func1(tHandle* handle)
{
  handle->c=handle->a+handle->b;
}

void main(void)
{
  tHandle handle;
  handle.a=3;
  handle.b=7;
  func1(&handle);
}

man muss noch dazu sagen dass ich bei meinen projekten einfach die kontrolle darueber brauche wo genau die sachen im speicher stehen.
aber auch sonst hat es definitiv den vorteil dass du weisst wie deine globalen variablen heissen; weil sie an einer einzigen stelle im code definiert sind.
und nicht holographisch ueber 50 .c-files verteilt.
 
Bei kleinen Programmen in C ist eine globale Variable oftmals das leserlichste. Pointer auf Structs mit dem Kontext rum zu reichen macht den Code komplizierter. Natürlich kann es notwendig sein. Nur ist das ganze kein Selbstzweck. Der Code soll leserlich und wartbar sein nicht beweisen welche Idiome der Autor kennt.
 
Pointer auf Structs ist schlicht der objektorientierte Ansatz. Wenn das Paradigma angemessen ist, ist das vollkommen in Ordnung und auch alles andere als kompliziert.

Ich verwende globale Variablen immer nur im systemnahen Zusammenhang.

Beispiel (ist unheimlich praktisch einfach zu seinem Code linken zu können :D):
https://sourceforge.net/p/hsk/libs/...9b1dd98e4c91d0/tree/src/hsk_isr/hsk_isr.h#l84

Interrupt 5 kann von verschiedenen Quellen getriggert werden. Dabei handelt es sich immer um Hardware direkt auf dem µC. Dafür gibt es dann schlicht ein globales struct in dem Module Funktionspointer eintragen können um den Interrupt zu benutzen.

Gegenbeispiel hsk_can_msg_create erzeugt CAN Bus Botschaftsobjekte und gibt den Typ hsk_can_msg zurück. Technisch ist einfach ein unsigned char, aber funktional ist das wie bei Dettus ein Pointer auf ein struct. Nur dass das struct ein Satz Register in einem separaten Hardware-Modul ist, auf das ich über einen Adressbus zugreifen kann. (Mit 3328 Byte Speicher verschwendet man keinen Arbeitsspeicher für Informationen, die sowieso in Hardware Registern liegt - selbst wenn man damit etwas Rechenzeit sparen kann, weil man den Umweg über den Adressbus spart).

Alle hsk_can_msg_* Funktionen bekommen das als ersten Parameter. In einer Programmiersprache mit Klassen wären das die Methoden einer hsk::can::Message Klasse und die create Funktion wäre der Konstruktor.
 
Zurück
Oben