用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]);