想象我有一个计划(macrotest.c)一组宏象这样:编译超出预处理器阶段,但在装配前阶段
#include <stdio.h>
#include <stdlib.h>
#define n1 75
#define n2 90
#define mac(x,y) ((x > y) ? (12) : (15))
int main(){
printf("%d",mac(n1,n2));
exit(0);
}
当你编译到组件(EM64T),你会得到以下内容:
的gcc -o -S macrotest.asm macrotest.c
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %eax
movl $15, %esi <------ This
movq %rax, %rdi
movl $0, %eax
call printf
movl $0, %edi
call exit
.cfi_endproc
你可以看到它立即MAC(N1,N2)转换为15 但是,当您编译的预处理器阶段,它只是膨胀出宏:
的gcc -o -E macrotest.prp macrotest.c
int main(){
printf("%d",((75 > 90) ? (12) : (15)));
exit(0);
}
有没有什么办法可以进一步细分代码而不进行汇编?
我不认为你可以做得比这更深入,因为优化是在编译时应用的,所以15会来自首先解析表达式,然后进行适当的评估。 – 2012-02-14 03:02:51
@JesusRamos当然,有一些工具可以做我要求的。 – sj755 2012-02-14 03:04:28
那么编译器会做到这一点,但事情是,它不会真的产生这样的输出(在你的情况下,只是用15替换整个东西),因为其中一些东西是特定的,将需要代码重新排序,这可能会使代码不可读几乎。 – 2012-02-14 03:05:48