【问题标题】:handling operations with macros in C在 C 中使用宏处理操作
【发布时间】:2016-06-25 14:44:29
【问题描述】:

我是处理宏的新手,我刚刚偶然发现了一个我无法弄清楚的练习。有人可以向我解释这里发生了什么吗? 如果我编译我可以看到输出是什么,但我自己无法得到它。 提前谢谢!

#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) );
}

【问题讨论】:

  • 是文本替换:用传递的参数替换宏定义中出现的参数。
  • 通过预处理器cpp 喂程序,看看替换是什么。之后就是指针算术...
  • 我可以解释“这里发生了什么”,但为了获得更好的答案,您能否告诉我们您期望看到的输出和实际看到的内容?

标签: c macros


【解决方案1】:

每个宏用法 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] );
}

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

【讨论】:

    【解决方案2】:

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

    #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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多