1、预定义宏

  • 对于预定义宏,相信大家并不陌生。为了方便处理一些有用的信息,预处理器定义了一些预处理标识符,也就是预定义宏。预定义宏的名称都是以“__”(两条下划线)开头和结尾的,如果宏名是由两个单词组成,那么中间以“_”(一条下划线)进行连接。并且,宏名称一般都由大写字符组成。
  • 在日常项目编程中,预定义宏尤其对多目标平台代码的编写通常具有重大意义。
  • 通过预定义宏,程序员使用“#ifdef”与“#endif”等预处理指令,就可使平台相关代码只在适合于当前平台的代码上编译,从而在同一套代码中完成对多平台的支持。从这个意义上讲,平台信息相关的宏越丰富,代码的多平台支持越准确。

2、C标准预定义宏

  • 标准 C 语言提供的一些标准预定义宏如表 1 所示。

表 1 常用的标准预定义宏
宏 描 述
_DATE_ 丐前源文件的编泽口期,用 “Mmm dd yyy”形式的字符串常量表示
_FILE_ 当前源文件的名称,用字符串常量表示
_LINE_ 当前源义件中的行号,用十进制整数常量表示,它可以随#line指令改变
_TIME_ 当前源文件的最新编译吋间,用“hh:mm:ss”形式的宁符串常量表示
STDC 如果今前编泽器符合ISO标准,那么该宏的值为1,否则未定义
_STDC_VERSION_ 如果当前编译器符合C89,那么它被定义为199409L;如果符合C99,那么它被定义为199901L:在其他情况下,该宏为宋定义
_STDC_HOSTED_ (C99)如果当前是宿主系统,则该宏的值为1;如果当前是独立系统,则该宏的值为0
_STDC_IEC_559 (C99)如果浮点数的实现符合IEC 60559标准时,则该宏的值为1,否则为未定义
_STDC_IEC_559_COMPLEX_ (C99)如果复数运算实现符合IEC60559标准时,则该宏的伉为1,否则为未定义
STDC_ISO_10646 (C99 )定义为长整型常量,yyyymmL表示wchai_t值遵循ISO 10646标准及其指定年月的修订补充,否则该宏为未定义

3、预定义宏的使用

  • 3.1 确定程序编译的时间

    • 利用“_DATE_”和“_TIME_”宏可以用来确定程序编译的时间。如下面的示例代码所示:
    int main (void)
    {
    printf("Copyright (c) Powered by www.develhome.com\n");
    printf("Compiled on %s at %s\n", __DATE__,__TIME__);
    return 0;
    }
  • 3.2 兼容编译器的程序

    • 利用“_STDC_”与“_STDC_VERSION_”宏可以编写那些需要兼容标准 C 和非标准 C 编译器的程序,如下面的示例代码所示:
    #ifdef __STDC__
    /* Some version of standard C */
    #if defined(__STDC__VERSION__)&&__STDC_VERSION__>=199901L
    /* C99 */
    #elif defined(__STDC_VERSION__)&&__STDC_VERSION__>=199409L
    /* C89 and amendment 1 */
    #else
    /* C89 but not amendment 1*/
    #endif
    #else /* __STDC__not defined */
    /*Not Standard C*/
    #endif
  • 3.3 异常跟踪

    • 利用_FILE_、LINE__与_FUNCTION(或者__func_)预定义宏的组合,在调试程序的时候可以很简单地在程序运行期进行异常跟踪。如下面的示例代码所示:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdlib.h>
    #define MESSAGE(message,assertion) \
    do{\
    if(!(assertion)){\
    printf("line %d in %s(%s)", __LINE__, __FILE__,__FUNCTION__);\
    if(message){\
    printf(":%s",message);\
    }\
    printf("\n");\
    abort();\
    }\
    }while(0)
    int OpenFile(const char *filename)
    {
    int fd;
    MESSAGE("文件名称不能够为空",filename);
    MESSAGE("文件不存在",0==access(filename,F_OK));
    fd = open(filename,O_RDONLY);
    close(fd);
    return 0;
    }
    int main(int argc,char **argv)
    {
    MESSAGE("命令参数不能够为空",argc==2);
    OpenFile(argv[1]);
    return 0;
    }
    • 其中,_FILE_、LINE__与_FUNCTION(或者_func)预定义宏分别表示文件名、行数与函数名,这样就可以帮助我们精确地定位出现异常的文件、行数与函数名。运行结果如图 4 所示。

    ![](https://img2018.cnblogs.com/blog/1213778/201812/1213778-20181220213218820-859526665.jpg)

    图 4

    - 其中,\__FILE__、__LINE__与\__FUNCTION__(或者\__func__)预定义宏分别表示文件名、行数与函数名,这样就可以帮助我们精确地定位出现异常的文件、行数与函数名。运行结果如图 4 所示。

预定义宏,C语言预定义的宏详解的更多相关文章

  1. visual c++中预定义的宏

    一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解 ...

  2. VS2013 预定义的宏

    Visual Studio 2013 预定义的宏 https://msdn.microsoft.com/zh-cn/library/b0084kay(v=vs.120).aspx 列出预定义的 ANS ...

  3. C标准中一些预定义的宏

    C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏(双下滑线) 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __ ...

  4. C标准中一些预定义的宏,如__FILE__,__func__等

    C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串 ...

  5. 2019-8-31-dotnet-新项目格式与对应框架预定义的宏

    title author date CreateTime categories dotnet 新项目格式与对应框架预定义的宏 lindexi 2019-08-31 16:55:58 +0800 201 ...

  6. dotnet 新项目格式与对应框架预定义的宏

    在 sdk style 的项目格式支持使用多框架开发,此时需要在代码里面通过宏判断,在编译的时候执行不同的代码.本文告诉大家在框架里面对应的预定义的条件编译符有哪些 在让一个 csproj 项目指定多 ...

  7. gcc中预定义的宏__GNUC__

    转载:gcc中预定义的宏__GNUC__ - Cccarl - 博客园 (cnblogs.com) 今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以 ...

  8. ARM编译器中预定义的宏

    arm系列目前支持三大主流的工具链,realview的armcc,iar ewarm的iccarm,gnu的gcc,编译器在编译的时候会预定义一些宏,这些宏在工程中起到不可或缺的作用. 例如 /* d ...

  9. Go语言Slice作为函数参数详解

    Go语言Slice作为函数参数详解 前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说. 个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装为结构体,结构体是值 ...

随机推荐

  1. 参数传递中编码问题(Get/Post 方式)(一)

    用JAVA在做一个支付接口时,需要和表现层的UTF8代码进行报文交换,因JAVA是GBK编码的,因此出现了小插曲.为此,花了点时间,重新梳理一下相关知识点. 以下内容是我转载的,觉得挺好的.... 一 ...

  2. spark集群配置以及java操作spark小demo

    spark 安装 配置 使用java来操作spark spark 安装 tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz rm spark-2.4.0-bin-hadoo ...

  3. NetBeans配置Xdebug 远程调试PHP

    1.配置PHP 说明:xdebug.trace_output_dir和xdebug.profiler_output_dir需要增加权限 #chmod 755 /usr/xdebug-tmp xdebu ...

  4. 优化深度神经网络(二)优化算法 SGD Momentum RMSprop Adam

    Coursera吴恩达<优化深度神经网络>课程笔记(2)-- 优化算法 深度机器学习中的batch的大小 深度机器学习中的batch的大小对学习效果有何影响? 1. Mini-batch ...

  5. .net 实现远程控制 远程协助

    一个同事 用c#实现的远程协助功能 服务端 负责客户端连接 转发 客户端 1.开启服务端 2.客户端 3.输入对方用户名 点击控制

  6. 解决mybatis中转义字符的问题

    xml格式中不允许出现类似“>”这样的字符,有如下两种解决方法 方法一:使用转义字符 SELECT * FROM test WHERE 1 = 1 AND start_date <= CU ...

  7. SELINUX配置

    今天试着将centos7的ssh默认端口改成1234,但改了后,SSHD服务竟然启动不了了.后来关了selinux测试,果然可以了.但这是运行环境,不能关,所以不得不配置semanage! 一.安装s ...

  8. Sprite Editor

    [Sprite Editor] 在Unity3D中,一个图片可以有多种类型(如下图).对于2D游戏开发,最常用的类型就是Sprite. 下图是Sprite Texture的属性,Packing Tag ...

  9. php 数据导出csv 注意问题。

    总共10W数据每次下载到9.5W就停了. 加上这个就好了 ini_set('memory_limit','512M'): //脚本运行无时间限制. set_time_limit(0); 要设置一个se ...

  10. 转-使用wifi调试程序

    转自:http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 数据线丢了,不想花钱去买,在网上看了看,an ...