C 编程 使用 ## 进行预处理时的串联
C programming Concatenation at preprocessing using ##
我有类似于下面的代码。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;
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- 当有大量内存分配时,如何处理C++编程中的异常
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- C 编程 使用 ## 进行预处理时的串联