美文网首页
C语言学习(2)----C语言中的预处理

C语言学习(2)----C语言中的预处理

作者: 特立独行的佩奇 | 来源:发表于2021-03-09 21:33 被阅读0次

    C语言预处理功能概要

    功能 说明
    宏定义 #define,#undef
    文件包含 #include
    条件编译 #ifdef,#ifndef,#if,#elif,#if definedxxx,#else,#endif
    编译信息和警告 #pragma message("message"),#pragma warning,#error
    文件名和行信息 #line
    标识符连接 x##8,将变量转换为字符串
    ANSI_C定义的C语言预处理指令

    预处理名称以及对应的含义

    功能 说明
    #define,#undef 宏定义,撤销已经定义的宏名称
    #include 使编译程序的另一源文件嵌入到带有#include 的源代码中
    #if #else #endif 如果#if 后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码
    #if #elif else #endif 表示如果有定义和如果没有定义,是条件编译的另一种方法
    #ifdef #endif 同上
    #error 编译程序的时候,遇到#error 就会产生一个编译错误信息,并且停止编译
    #pragma 可以设定编译程序完成一系列的动作
    #/## 字符串转换和标志符连接

    宏定义

    宏(Macro),是一种批量处理的称谓,计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式
    宏定义又称为宏代换、宏替换,简称“宏”,宏定义是在编译预处理阶段展开进行替换的。
    编译器预定义宏

    _LINE_  编译文件的行号字符串
    _DATE_  编译时刻日期字符串
    _FILE_   编译文件名称
    _TIME_ 编译文件时间字符串
    _STDC_ 判断文件是不是定义成标准C
    
    注意点:宏定义字符串不需要双引号

    #define PATH "C:\English\demo" 错误
    #define PATH C:\English\demo 正确

    注意点:宏定义中要添加括号

    NA

    注意点:. 宏定义常量的时候注意后缀

    #defien SEC_A_YEAR (60*60*24*365) 错误
    #defien SEC_A_YEAR (60*60*24*365)UL 正确

    注意点: 宏定义函数每行必须加上连接符
    #define swap(x, y)\
    x = x + y;\
    y = x - y;\
    x = x - y;
    或者
    #define MALLOC(n, type) \
      ( (type *) malloc((n)* sizeof(type)))
    

    条件编译

    条件编译的功能是使得我们可以按照不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,对程序的移植和调试都很有用

    • 形式一
      #ifdef 标识符
      #endif

    • 形式二
      #ifdef 标识符
      #else
      #endif

    • 形式三
      #ifndef 标识符
      #else
      #endif

    • 形式四
      #if 常量表达式
      程序段1
      #else
      程序段
      #endif
      如果常量表达式的值为真,则进行程序段1的编译,否则进行程序段2 的编译

    实例:

        #if (demo_a == true)
        //#if (demo_a)
            MI_PRINT("demoa == true \n");
        #else
            MI_PRINT("demoa != true \n");
        #endif
        #if (demo_c == 1)
            MI_PRINT("demo_C = 1 \n");
        #elif (demo_c == 2)
            MI_PRINT("demo_C = 2 \n");
        #elif (demo_c == 3)
            MI_PRINT("demo_C = 3\n");
            #error this is my error
        #elif (demo_c == 4)
            MI_PRINT("demo_C = 4\n");
            #error this is my error
        #endif
    
    • 形式五
      #if defined XXX_XXX
      #endif 是条件编译,是根据你是否定义了XXX_XXX这个宏,而使用不同的代码。

    #if !defined XXX_XXX
    #define XXX_XXX
    #endif 是为了避免.h头文件被重复include。

    文件包含

    文件包含是预处理的一个重要功能,它将多个源文件链接成一个源文件进行编译,结果生成一个目标文件,C语言提供#include命令来实现文件包含的操作,它实际是宏替换的延伸。

    • 格式1
      #include <filename>
      预处理到系统规定的路径去获取这个文件,找到文件后,用文件内容替换该语句。
    • 格式2
      #include “filename”
      标识在当前目录中查找文件名为filename 的文件,如果没有找到,则安装系统指定的路径去搜索其他目录,找到文件后,用文件内容替换该语句。

    #include也是支持相对路径的,格式如下
    . 代表当前路径
    .. 代表上一级目录

    预处理

    • #error message
      编译程序的时候,只要遇到#error 就会生成一个编译错误提示消息,并且停止编译
      #error 编译器错误 (不需要加引号)
    • #pragma 消息文本
      比如:
      #pragma message("now we run into this \n")
      在编译就会在编译log 中打印上面的文本
      这个命令可以帮助我们判断编译的流程
      #ifndef BIONIC
      #pragma message("not define bionic \n")
      #endif

    • #pragma once
      头文件中加入这条指令就可以保证头文件被编译一次,防止重复包含。

    #pragma resource
    #pragma resource “*.dfm” 表示把*.dfm 的资源都加入工程。

    • #pragma comment
      #pragma comment(…) 用于将一个注释记录放入对象文件或者可执行文件中。

    • #pragma comment(lib, “user32.lib”)
      上面的指令用于将 user32.lib 放入工程中。

    • #pragma warning
      常用:
      #pragma warning(disable:4507 34) 不显示4507 和34 号警告
      #pragma warning(once:4385) 4385号警告信息仅仅报告一次
      #pragma warning(error:164) 将164 号警告作为一个错误

    • #pragma code_seg
      #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )

    例如:
    //默认情况下,函数被存放在.text节中
    void func1() { // stored in .text
    }
    //将函数存放在.my_data1节中
    #pragma code_seg(".my_data1")
    void func2() { // stored in my_data1
    }

    • #与##
      # 可以将语言符号转换为字符串
      #define STRING(x) #x STRING(1+1) 相当于变成了 “1+1” 字符串

    ## 用于将前后的字符串连接起来
    比如定义:
    #define XNAME(n) x##n
    XNAME(8) 等同于 x8

    Review History
    日期 说明
    2022/10/1 修改部分格式
    NA NA

    相关文章

      网友评论

          本文标题:C语言学习(2)----C语言中的预处理

          本文链接:https://www.haomeiwen.com/subject/leobqltx.html