2017-11-07 6 views
0

mit habe ich Code wie unten. Das changename() Makro funktioniert gut. Wert zu "pin_harf. (A, b, c ...) zuweisen" funktioniert gut wie bitweise.C-Programmierung Verkettungs bei der Vorverarbeitung ##

Mein Problem ist, ich nicht Attribut pin_harf = 0x02 zuweisen kann. Es gibt einen Kompilierungsfehler. Warum kann ich den Wert struct type instance nicht zuweisen? Normalerweise nehmen Strukturtypen Werte an.

Wenn ich versuche, wie pin = 0x02 es funktioniert zuweisen. Ich kann den Wert von pin_harf.b erhalten, was 1 entspricht und korrekt ist.

Wie funktioniert die #define Arbeit? Könnten Sie bitte erklären?

// Example program 
#include <iostream> 
#include <string> 
using namespace std; 
#define changename(NAME, STRUCT)\ 
       volatile union\ 
       {\ 
       unsigned char NAME;\ 
       STRUCT NAME ## _harf;\ //is this the problem? How? 
       }; 
int main() 
{ 
    typedef struct{ 
     unsigned char a :1; 
     unsigned char b :1; 
     unsigned char c :1; 
     unsigned char d :1; 
     unsigned char e :1; 
     unsigned char f :1; 
     unsigned char g :1; 
     unsigned char h :1; 
     }bit; 
    changename(pin,bit); 
    /*pin_harf.a=0b1; 
    pin_harf.b=1; 
    pin_harf.c=1; 
    pin_harf.d=1; 
    pin_harf.e=1; 
    pin_harf.f=1; 
    pin_harf.g=1; 
    pin_harf.h=1;*/ 

    pin_harf =(bit) 0x09; // the problem is here 
    cout << "Pin Harfi: " <<(int)pin_harf.a<<endl; // Complile error 
    /*If the string "harf" deleted it takes attribute else there is a failure. 

    /*pin = 0x09; 
    cout << "Pin Harfi: " <<(int)pin_harf.a<<endl; //this works I get the specified value*/ 
} 
+2

Bitte erläutern Sie klar, was Sie erreichen wollen. Sie erstellen eine "union" mit einem "pin_harf" -Mitglied und versuchen dann, innerhalb von 'main()' darauf zuzugreifen, ohne trotzdem eine Variable 'pin_harf' zu deklarieren. Es ist ziemlich unklar, was Sie wollen und/oder warum. –

+0

Nun, Sie haben "Pin" genau als Verbindung mit Ihrem "Struct Bit" deklariert, um Pin zu verwenden, um den ganzen Wert zu setzen, nicht wahr? Nun, warum versuchst du pin_harf dafür zu benutzen? – Ctx

+0

Die Definition deklariert eine unbenannte Vereinigung, ohne eine Variable dieses Typs zu deklarieren. Es könnte funktionieren, wenn Sie im C11-Modus kompilieren (Für gcc add Flag '-std = c11'), aber ich bin mir nicht sicher, da ich in C++ nicht aktuell bin und die gefundene Referenz nur auf unbenannte Strukturen/Vereinigungen verweist in einer Struktur. –

Antwort

1

Ihre Codezeile changename(pin,bit); erweitert, um die folgenden (mit Leerzeichen, um Klarheit hinzugefügt):

volatile union 
{ 
    unsigned char pin; 
    bit pin_harf; 
};; 

Das ist nicht sehr nützlich ist. Es wäre hilfreich, wenn Sie das letzte Semikolon von der Makro-Definition wie folgt entfernt:

#define changename(NAME, STRUCT) \ 
    volatile union \ 
    { \ 
     unsigned char NAME; \ 
     STRUCT NAME ## _harf; \ 
    } 

Dann könnten Sie das Makro verwenden, um eine Variable zu deklarieren, wie folgt:

changename(pin,bit) foo; 

und Zugriff auf die Mitglieder der die Vereinigung typisierte Variable wie folgt:

foo.pin = 42; 
foo.pin_harf.a = 1; 

Oder Sie das Makro verwenden könnte eine Art zu nennen wie folgt:

typedef changename(pin,bit) foo_t; 

Und verwenden Sie die genannten Art eine Variable zu deklarieren:

foo_t foo; 
+0

@ Ian Abbott danke. Ich habe den Grund. Union-Typ legt den Wert auf den angegebenen Speicherort fest, und daher ist es Union, könnte es durch einen anderen Variablennamen aufrufen. Wie du mit "foo" angedeutet hast. – BTech