
Zitat von
SprinterSB
...und bei typedef fliegen wir aus der Kurve, nämlich wenn eine Struktur in mehreren Modulen verwendet werden soll.
Kann ich nicht nachvollziehen. Bei mir funktioniert folgendes ohne Probleme in einer in allen Sourcen includeten Headerdatei:
Code:
/******************************************************************************
Typendefinition fuer die Sensoren
*/
typedef struct {
unsigned char aktiv; // Startet/Stoppt die Sensoren
unsigned char taster; // Tasterwert mit PollSwitch() geholt
unsigned int batterie; // Batteriewert wie Batterie()
unsigned int linie [4]; // 0:Links-Dunkel 1:Rechts-Dunkel
// 2:Links-Hell 3:Rechts-Hell
unsigned int rad [2]; // Zaehlerwerte der Radencoder
} sens_t;
#ifdef MAIN
#define EXTERN
#else
#define EXTERN extern
#endif
/* Je nach Definition von EXTERN, werden die aufgefuehrten Variablen
declariert oder definiert.
Somit kann GENAU EIN SOURCE (Source mit der Main()-Funktion macht Sinn)
die Variablen 'erstellen', aber alle anderen Sourcen koennen wegen der
extern-Angabe auch auf die Variable zugreifen.
*/
EXTERN volatile sens_t sens;
EXTERN int g_kp;
EXTERN int g_ki;
EXTERN int g_kd;

Zitat von
SprinterSB
Ebenso bei inline-Funktionen.
Da kann ich nicht mitreden, da ich bis jetzt noch nie inline-Code benutzt habe.

Zitat von
SprinterSB
Drittens hakt es aus, wenn du einer Variablen einen Initializer geben willst:
Das ist richtig, hier muss das Programm selbst initialisieren.

Zitat von
SprinterSB
Da eine Zeile Code sparen zu wollen ist IMHO an der falschen Stelle gespart.
Es geht mir nicht um die Zeile Code. Ich will nur sicherstellen, dass die Typen der ZWEI Zeilen Code IMMER identisch sind. Das erhalte ich über mein Konstrukt, da ich ja nur die eine Zeile habe.
Hier ist das Potenzial für Differenzen, und wenn es nur nachträglich geschieht, dass der Typ der Variablen nur in einem Source geändert wird. Vergisst man, dass es noch den Header gibt, dann bekommt man zwar ein Warning beim Compilieren, aber es ist trotzdem möglich 2 verschiedene Datentypen zu nutzen. OK, wer die Warnings nicht beachtet hat selber Schuld, und wer vergisst, dass es 2 Source-Stellen gibt, ist gut beraten mal Urlaub zu machen. Aber genau dies ist schon immer eine extreme Gefahr bei uns in der Firma gewesen. (Bei dem Krempel von uns handelt es sich so ca. um 4500 Sourcen.)

Zitat von
SprinterSB
Nein. Wenn die Funktion static (aufs Modul begrenzt) sein sollte, würde sie nicht im Header stehen, sondern als
static void mache();
nur in dem Modul, wo sie gebraucht wird. Für globale (über mehrere Module hinweg) verwendbare Funktionen, gehören Prototypen in die jeweiligen Header. Und zwar im Header zur Quelle, welche die Funktion implementiert.
Ja, bei static ist mir das schon klar, aber in deinem Beispiel zum source.c hast du als arbeitende Funktion (keine deklaration) diese als extern angelegt. Da wollte ich mal nachfragen, ob bzw. was ich da nicht verstehe. 
@ongni42
Ne, ne, ich unterscheide ja genau, dass ich nur einmal die Definition mache. Regeln tut das der Code mit dem #define EXTERN. Entweder hat EXTERN keinen 'Inhalt' oder es steht dann zur Deklaration eben doch das 'extern' dahinter.
OK, ich denke das nun jeder genug hat über dieses Thema zu debatieren. Ich hoffe hier niemandem auf die Füße getreten zu haben und wünsche euch (und mir) weiterhin schönen, fehlerfreien Code.
Lesezeichen