zoukankan      html  css  js  c++  java
  • C语言中预处理器的相关知识:

    预处理过程时,会做以下事情或着更多:

    将所有的#define删除,并且展开所有的宏定义;

    处理所有条件编译指令,如#if,#ifdef等;

    处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。

    删除所有的注释//;

    添加行号和文件标识:每行的格式是“#   行号   文件名   标志“,其中的”行号“与”文件名“表示从它后一行开始的内容来源于

                                哪一个文件的哪一行,标志可以是1,2,3,4四个数字,每个数字的含义如下:

                                 1:表示新文件的开始

                                 2:表示从一个被包含的文件中返回

                                 3:表示后面的内容来自系统头文件

                                 4:表示后面的内容应当被当做一个隐式的‘extern”C“’块

            

    include搜索文件时,会在以下几个路径搜索:

    1.编译的时候指定路径
    2.gcc的specs里
    3.使用-I参数指定的路径
    4.gcc环境变量设置(C_INCLUDE_PATH)

    另外:include "fllename.h",先在当前目录寻找,然后再系统目录寻找;
            include <fllename.h>,只在系统目录寻找,找不到报错;

    预处理常用命令:

    #define              定义一个预处理宏
    #undef               取消宏的定义
    #include             包含文件命令
    #include_next    与#include相似, 但它有着特殊的用途
    #if                     编译预处理中的条件命令, 相当于C语法中的if语句
    #ifdef                判断某个宏是否被定义, 若已定义, 执行随后的语句
    #ifndef              与#ifdef相反, 判断某个宏是否未被定义
    #elif                  若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
    #else                与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
    #endif               #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined              与#if, #elif配合使用, 判断某个宏是否被定义
    #line                 标志该语句所在的行号,如本来是第4行,你有第4行写了#line 100,它就认为是第100行(__LINE__)
    #                      将宏参数替代为以参数值为内容的字符窜常量
    ##                    将两个相邻的标记(token)连接为一个单独的标记
    #pragma           说明编译器信息
    #warning          显示编译警告信息
    #error              显示编译错误信息

    标准C中定义了一些对象宏, 这些宏的名称以"__"开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义.

    下面列出一些标准C中常见的预定义对象宏(其中也包含gcc自己定义的一些预定义宏:
    __LINE__             当前语句所在的行号, 以10进制整数标注.
    __FILE__             当前源文件的文件名, 以字符串常量标注.
    __DATE__            程序被编译的日期, 以"Mmm dd yyyy"格式的字符串标注.
    __TIME__            程序被编译的时间, 以"hh:mm:ss"格式的字符串标注, 该时间由asctime返回.
    __STDC__            如果当前编译器符合ISO标准, 那么该宏的值为1
    __STDC_VERSION__    如果当前编译器符合C89, 那么它被定义为199409L, 如果符合C99, 那么被定义为199901L.
    __STDC_HOSTED__        如果当前系统是"本地系统(hosted)", 那么它被定义为1. 本地系统表示当前系统拥有完整的标准C库.
    gcc定义的预定义宏:
    __OPTMIZE__            如果编译过程中使用了优化, 那么该宏被定义为1.
    __OPTMIZE_SIZE__    同上, 但仅在优化是针对代码大小而非速度时才被定义为1.
    __VERSION__            显示所用gcc的版本号.

    备注:

    #if 会把没有定义过的标准符视做为0, 如:#if DEBUG,如果没有定义DEBUG, 则测试#if DEBUG 会失败。

    #if defined(宏)  … …,#endif

    参考:

    http://blog.sina.com.cn/s/blog_4bab8e7f01011gef.html

    http://blog.csdn.net/a627088424/article/details/11934229

    http://blog.csdn.net/shellching/article/details/4381671

  • 相关阅读:
    RTSP协议转RTMP协议的行业视频接入网关EasyRTSPLive如何实现音频转码的
    RTSP协议转RTMP协议的行业视频接入网关EasyRTSPLive之跨平台ini配置及通道的方法
    GB/T28181协议EasyGBS播放1080p视频直播会花屏
    国标GB/T28181协议下播放器起播慢或者延迟高如何解决?
    EasyGBS查找大华设备的录像列表时失败
    ffmpeg增加h264编解码功能模块方法
    EasyNVR控制台运行出现invalid license关于计算机保护软件类似于360、腾讯云管家等限制相关问题
    摄像机经过多级路由转换无法被EasyNVR拉流问题处理方法
    使用EasyNVR软件对接海康摄像头对接失败问题解析
    GB/T28181协议使用EasyNVR降低播放延迟方法
  • 原文地址:https://www.cnblogs.com/yinheyi/p/5920543.html
Copyright © 2011-2022 走看看