• 《C语言深度解剖》学习笔记之预处理


    第3章 预处理

    1.下面两行代码都是错的。因为注释先于预处理指令被处理,当这两行被展开成“//……”和“/*……*/”时,注释已处理完毕,所以出现错误

    #define BSC //
    #define BMC /*
    #define EMC */
    
    BSC my single - line comment
    BMC my multi - line comment EMC

    【规则 3-1】函数宏的调用不能缺少参数,如果此函数宏有参数的话。

    【规则 3-2】在定义函数宏时,每个参数实例都应该小括号括起来,除非它作为#或##的操作数。

    2.条件编译

    • 第1种形式
    #ifdef  标识符
    程序段 1
    #else
    程序段 2
    #endif
    • 第2种形式
    #ifndef  标识符
    程序段 1
    #else
    程序段 2
    #endif
    • 第3种形式
    #if 常量表达式
    程序段 1
    #else
    程序段 2
    #endif

    3.#error预处理

    编译程序时,只要遇到#error就会生成一个编译错误提示消息,并停止编译。语法格式为

    #error error-message

    4.#line预处理

    #line的作用是改变当前行数和文件名称

    (作用:编译器对C源码编译的过程中会产生一些中间文件,通过这条指令,可以保证文件名是固定的,不会被中间文件代替,有利于分析)

    5.#pragma message

    能够在编译消息输出窗口中输出相应的信息。

    #pragma message(“消息文本”)

    6.#pragma pack 和内存对齐问题

      对 字,双字和四字来说,自然边界分别是偶数地址,可以被4整除的地址和可以被8整除的地址。原因在于为了访问未对齐的内存,处理器需要做两次内存访问;然而对于对齐的内存访问仅需要一次访问。

    #pragma pack(n)   //编译器将按照n字节对齐    
    #pragma pack()     //取消自定义字节对齐方式
    • 每个成员分别按自己的方式对齐,并能最小化长度
    • 复杂类型(如结构)的默认对齐方式是他的最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
    • 对齐后的对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

    7.“#”运算符

    8.“##”运算符

  • 相关阅读:
    死锁
    信号量
    实现临界区互斥的基本方法
    进程同步的基本概念:临界资源、同步和互斥
    操作系统典型调度算法
    [ 转]Collections.unmodifiableList方法的使用与场景
    【转】Android Support v4、v7、v13的区别和应用场景
    [转]finished with non-zero exit value 2
    [转]Git远程操作详解
    [转] git fetch与pull
  • 原文地址:https://www.cnblogs.com/love-u/p/3283659.html
Copyright © 2020-2023  润新知