C编程使用##进行预处理的连接

问题描述 投票:0回答:1

我有类似下面的代码。 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*/
}
c++ unions preprocessor
1个回答
1
投票

您的代码行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;
© www.soinside.com 2019 - 2024. All rights reserved.