用C语言中的宏处理操作
我对处理宏还不熟悉,我刚刚偶然发现了一个我无法理解的练习。有人能给我解释一下这里发生了什么事吗? 如果我编译的话,我可以看到输出是什么,但我自己却无法得到它。 提前谢谢你用C语言中的宏处理操作,c,macros,C,Macros,我对处理宏还不熟悉,我刚刚偶然发现了一个我无法理解的练习。有人能给我解释一下这里发生了什么事吗? 如果我编译的话,我可以看到输出是什么,但我自己却无法得到它。 提前谢谢你 #define M(varname, index) ( ( (unsigned char*) & varname )[index] ) int main(void) { int a = 0x12345678; printf( "%x %x\n", M(a,0), M(a,3) ); printf( "%x %x\
#define M(varname, index) ( ( (unsigned char*) & varname )[index] )
int main(void) {
int a = 0x12345678;
printf( "%x %x\n", M(a,0), M(a,3) );
printf( "%x %x\n", M(a,1), M(a,2) );
}
每个宏用法M(x,y)
都替换为((unsigned char*)&x)[y]
因此,预处理后的代码如下所示:
int main(void) {
int a = 0x12345678;
printf( "%x %x\n", ( (unsigned char*) & a )[0], ( (unsigned char*) & a )[3] );
printf( "%x %x\n", ( (unsigned char*) & a )[1], ( (unsigned char*) & a )[2] );
}
就像Thomas B Preusser在OP问题注释中添加的那样,大多数C编译器套件允许使用某些编译器标志或工具(如f.e.宏)获取预处理代码,方法是在尝试编译代码(预处理)之前用一个替换另一个。因此,在您给出的示例中:
#define M(varname, index) ( ( (unsigned char*) & varname )[index] )
每次出现M(varname,index)
时,它将被((unsigned char*)&varname)[index]
例如,就代码所做的工作而言(为了可读性稍微重新格式化):
这:
- 获取变量
a的地址
- 将地址强制转换为
无符号字符*
- 获取此指针/数组中的第0个元素
- 将其格式化为字符串,将第一个
替换为十六进制(%x
表示十六进制)%x
它用第二个
%x
对第三个元素重复此操作。这是文本替换:用传递的参数替换宏定义中出现的参数。通过预处理器cpp
将程序送入以查看替换内容。在那之后,是指针运算…我可以解释“这里发生了什么”,但是为了得到更好的答案,你能告诉我们你期望看到的输出和你实际看到的吗?
printf("%x %x\n", ((unsigned char*) &a)[0], ((unsigned char*) &a)[3]);