zoukankan      html  css  js  c++  java
  • 《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.“##”运算符

  • 相关阅读:
    java 基础知识
    winform判断一个事件是否已经绑定了事件处理函数
    优质文章
    优质博客
    缩略图的创建
    记录一次错误处理 (xml序列化和反序列化相关)
    文件同步软件
    博客园优质博主集锦
    不错的博文集锦
    cesiumjs
  • 原文地址:https://www.cnblogs.com/love-u/p/3283659.html
Copyright © 2011-2022 走看看