gpt4 book ai didi

c++ - 使用 ## 进行预处理时的 C 编程串联

转载 作者:行者123 更新时间:2023-11-28 04:55:46 25 4
gpt4 key购买 nike

我有类似于下面的代码。 changename() 宏工作正常。为“pin_harf.(a,b,c...)”赋值按位工作正常。

我的问题是我无法将属性分配给 pin_harf = 0x02。它给出了一个编译错误。为什么我不能立即将值分配给结构类型实例?通常结构类型采用值。

如果我尝试像 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 类型变量的成员:

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

或者您可以使用宏来命名类型,如下所示:

typedef changename(pin,bit) foo_t;

并使用命名类型来声明一个变量:

foo_t foo;

关于c++ - 使用 ## 进行预处理时的 C 编程串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47156617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com