2017-11-10 4 views
0

Ich habe 3 DateienStruktur in einer anderen Quelle verwendet, um Dateien

//--------------reg_des.h--------------- 
struct reg 
      { 
       unsigned int i : 4; 
       unsigned int j : 4; 
      }; 
extern struct reg; 



//--------------reg_des.c--------------- 

struct reg xyz_reg = {.i = 2,.j = 1}; 


//--------------main.c--------------- 
#include "reg_des.c" 
void display_onmodule(struct reg xyz_reg_1) 

int main() 
{ 
    display_onmodule(xyz_reg); 
} 

void display_onmodule(struct reg xyz_reg_1) 
{ 
    ..... 
} 

Hier habe ich eine Struktur in einer Header-Datei und initialisieren Variable Strukturtyp in einer anderen Quelldatei deklariert. Eigentlich möchte ich wissen, ist es richtig, eine Struktur zu deklarieren, die von mehreren Quelldateien verwendet werden kann?

+0

'extern struct reg;' bedeutet nichts. Um ** eine Struktur ** zu definieren, benötigen Sie nur die Definition, wie Sie sie in der Kopfzeile gemacht haben. Um eine Instanz einer solchen Struktur zu deklarieren, benötigen Sie die Deklaration, d. H. Einschließlich der Kopfzeile. Um auf die Instantiierung "xyz_reg" der Struktur "reg" zuzugreifen, müssen Sie sie in der Header-Datei als "extern struct reg xyz_reg;" definieren. –

+0

Um auf die Instantiierung 'xyz_reg' der Struktur' reg' in verschiedenen Einheiten (Dateien) zuzugreifen, müssen Sie sie in der Header-Datei als 'extern struct reg xyz_reg;' definieren und den Header in jede Quelle einfügen. –

+0

@Frankie_C Außer, er sollte das nicht tun, weil es ein schreckliches Programmdesign ist. – Lundin

Antwort

0

Nein, das ist nicht der richtige Weg, Programme zu entwerfen - das ist Spaghetti-Programmierung mit globalen Variablen. Es gibt fast keinen Fall, in dem globale (nicht const) Variablen zu verwenden sind.

Darüber hinaus, wenn Sie jemals eine Notwendigkeit finden, eine .c-Datei aufzunehmen, bedeutet dies, dass Ihr Design komplett verrückt geworden ist. Wir enthalten nur .h-Dateien.

Der einfachste Weg, um Ihr Programm zu beheben, ist dies:

//--------------reg_des.h--------------- 
#ifndef REG_H // always use header guards! 
#define REG_H  

struct reg // note: this bit-field is completely non-portable 
{ 
    unsigned int i : 4; 
    unsigned int j : 4; 
}; 

void reg_init (struct reg* r); 

#endif // REG_H 


//--------------reg_des.c--------------- 
#include "reg_des.h"  

void reg_init (struct reg* r) 
{ 
    *r = (struct reg) {.i = 2,.j = 1}; 
} 




//--------------main.c--------------- 
#include "reg_des.h" 

void display_onmodule(struct reg xyz_reg_1); 

int main() 
{ 
    struct reg xyz_reg; 
    reg_init(&xyz_reg); 

    display_onmodule(xyz_reg); 

    // pass on xyz_reg to x different files here, etc 
} 

void display_onmodule(struct reg xyz_reg_1) 
{ 
    ..... 
} 

Es gibt noch bessere Designs sind, mit eigener Kapselung, aber die oben ist akzeptabel.

+1

ist nicht Bereich der Struktur reg xyz_reg in der Funktion main()? aber ich möchte es global sein –

+0

@GauravKumar Warum? Es gibt nie einen Grund dafür. Auch wenn Sie eine Hardwareregisterkarte schreiben, sollten Sie keine globalen Variablen verwenden. Noch sollten Sie Bit-Felder verwenden, weil sie völlig unzuverlässig sind. – Lundin

Verwandte Themen