求助C语言 宏定义 (*(byte*)&(##x)+1)
发布网友
发布时间:2024-10-19 15:01
我来回答
共5个回答
热心网友
时间:2024-10-21 21:34
##在宏代换是这样处理的:
each ## is deleted, together with any white space on either side.--C89
翻译过来也就是每个##都会被删掉,包括在它两边的空格。
##不是连接符,就像你说的##“一般”用作连接符,注意是“一般”,这是它的典型用法。这种用法也是根据他的这一特性来的。
#define A(M) M ## 87
int i = A(19); 这样的,##前后都有空格,最后宏代换完,就是i = 1987。
热心网友
时间:2024-10-21 21:31
只是一个代号吧~你最好把题目也发来啊
热心网友
时间:2024-10-21 21:33
根据第一行替换可知
lowbyte(X)会变成: ( *(unsigned char *) &(##X) +1 )
就是说对 (##X)取地址,然后强制类型转换成一个字符指针类型,然后定位在这个位置的低字节上
通过分析可知,##X表示的是一个变量或者是另外的一个宏替换规则
热心网友
时间:2024-10-21 21:34
#define A(a,b) a##b
预处理运算符##扩展了一种连接实际参数的手段。
比如:
A(k,1) 宏展开之后 k1
A(k,2) 展开之后 k2
热心网友
时间:2024-10-21 21:32
## 连接符与# 符
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所 谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来 的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子。
假设程序中已经定义了这样一个带参数的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同时又定义了一个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
paster( 9 );
那么在编译时,上面的这句话被扩展为:
printf( "token" "9" " = %d", token9 );
注意到在这个例子中,paster(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9