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*/
}
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. –
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
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. –