预处理及作用

有基础的一般都知道预处理,但作用在未真正使用在项目中时很多人其实都对他不以为然,学校时的我就是其中一员

预处理都是#开头,其在编译时展开,而且没有作用域,这两点是预处理中最关键的说明,

作用一:包含头文件头文件就可以来保证在多个文件使用时的头文件为一,样例如下

#ifndef TEST_H
#define TEST_H
......
#endif

作用二:通过预处理控制需要编译的代码

test.c

#include <stdio.h>


int main()
{
#ifdef DEBUG
    printf("debug\n");
#endif
    printf("hello world!\n");
    return 0;
}

通过gcc进行编译gcc test.c -o test,生成test可执行文件
执行可执行文件 ./test
输出: hello world!

gcc test.c -o test -DDEBUG
./test

输出: debug
hello world!

-D代表定义宏, -DDEBUG代表定义DEBUG宏,因为其是编译时展开,可发现这两种方式生成的汇编代码是不同的,可通过gcc -S生成汇编代码
这里介绍一下gcc生存可执行文件的过程:
gcc -E 预处理生成 .i 将头文件插入
gcc -S 编译生成 .s 汇编代码文件
gcc -c 汇编生成 .o 二进制文件
gcc 链接生成执行文件
gcc -S test.c生成test.s

    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    movl    $0, -4(%rbp)
    leaq    L_.str(%rip), %rdi
    movb    $0, %al
    callq   _printf
    xorl    %eax, %eax
    addq    $16, %rsp
    popq    %rbp
    retq
    .cfi_endproc

gcc -S test.c -DDEBUG

    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register %rbp
    subq    $16, %rsp
    movl    $0, -4(%rbp)
    leaq    L_.str(%rip), %rdi
    movb    $0, %al
    callq   _printf
    leaq    L_.str.1(%rip), %rdi
    movb    $0, %al
    callq   _printf
    xorl    %eax, %eax
    addq    $16, %rsp
    popq    %rbp
    retq
    .cfi_endproc

可发现下面的比上面的多了三行汇编指令,在程序的执行过程中就表示上面的执行比下面的快,在大型程序中就可以通过预处理控制是否需要编译,来保证程序只编译必要的,既可以保证程序的体积也可以提高程序的运行速度

但因为其没有作用域可言,在多个程序的编译中只要指定了并且在程序上方就都会有,需要通过#undef取消

写的不怎么好,各位看官见谅了,有问题欢迎指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值