使用C中的宏处理操作

时间:2016-06-25 14:44:29

标签: 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) );
}

2 个答案:

答案 0 :(得分: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] );
}

与Thomas B Preusser在OP问题评论中添加的一样,大多数C编译器套件允许使用某些编译器标志或f.e等工具获取预处理代码。 with GCC as mentioned here.

答案 1 :(得分:3)

在尝试编译代码(预处理)之前,宏通过将一个东西替换为另一个东西来工作。所以在你给出的例子中:

#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*
  • 获取此指针/数组中的第0个元素
  • 将其格式化为字符串,将第一个%x替换为十六进制(%x用于十六进制)

对于带有第二个%x

的第3个元素,它会重复此操作