使用C中的宏处理操作

kas*_*ime 4 c macros

我刚开始处理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) );
}
Run Code Online (Sandbox Code Playgroud)

mak*_*dev 6

每个宏用法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] );
}
Run Code Online (Sandbox Code Playgroud)

就像Thomas B Preusser在OP问题评论中添加的那样,大多数C编译器套件允许使用某些编译器标志或工具来获取预处理代码,例如此处提到的带有GCC的 fe .