我有类似下面的代码。 changename()
宏工作得很好。将值赋给“pin_harf。(a,b,c ...)”按位运行正常。
我的问题是我无法为pin_harf = 0x02
分配属性。它给出了编译错误。为什么我不能一次为结构类型实例赋值?通常,struct类型采用值。
如果我尝试分配像pin = 0x02
它的工作原理。我可以从pin_harf.b
获得值,它等于1
并且是正确的。
#define
如何运作?你能解释一下吗?
// 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*/
}
您的代码行changename(pin,bit);
扩展为以下内容(为清晰起见添加了空格):
volatile union
{
unsigned char pin;
bit pin_harf;
};;
这不是很有用。如果从宏定义中删除最后一个分号,将会更有用,如下所示:
#define changename(NAME, STRUCT) \
volatile union \
{ \
unsigned char NAME; \
STRUCT NAME ## _harf; \
}
然后你可以使用宏来声明一个变量,如下所示:
changename(pin,bit) foo;
并访问union-typed变量的成员,如下所示:
foo.pin = 42;
foo.pin_harf.a = 1;
或者您可以使用宏来命名类型,如下所示:
typedef changename(pin,bit) foo_t;
并使用命名类型声明变量:
foo_t foo;