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

C programming Concatenation at preprocessing using ##

本文关键字:预处理 编程 使用      更新时间:2023-10-16

我有类似于下面的代码。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;

并访问联合类型变量的成员,如下所示:

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

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

typedef changename(pin,bit) foo_t;

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

foo_t foo;