[英]handling operations with macros in 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\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编译器套件允许使用某些编译器标志或工具来获取预处理代码,例如此处提到的带有GCC的 fe 。
在尝试编译代码(预处理)之前,宏通过将一个东西替换为另一个东西来工作。 所以在你给出的例子中:
#define M(varname, index) ( ( (unsigned char*) & varname )[index] )
每次出现M(varname, index)
时,它将替换为( (unsigned char*) & varname )[index]
就代码的作用而言,作为示例(为了可读性而略微重新格式化):
printf("%x %x\n", ((unsigned char*) &a)[0], ((unsigned char*) &a)[3]);
这个:
a
的地址 unsigned char*
%x
替换为十六进制( %x
表示十六进制) 它用第二个%x
重复第三个元素
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.