预定义宏,C语言预定义的宏详解

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 所示。

      图 4

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

原文地址:https://www.cnblogs.com/CH520/p/10152328.html

时间: 2024-08-26 17:17:30

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

常用的预定义的宏

常用的预定义的宏 常用的预定义的宏有:__LINE__ 当前源程序行的行号,用十进制整数常量表示 __FILE__ 当前源文件的名称,用字符串常量表示 __DATE__ 编译时的日期,用"MM dd yyyy"形式的字符串常量表示 __TIME__ 编译时的时间,用"hh:mm:ss"形式的字符串常量表示 __STDC__ 当且只当编译器遵循ISO标准时,它的值是十进制常量1 __STDC__VERSION__ 如果编译器遵循C99,则这个宏的值是199901L,其

visual c++中预定义的宏

一.主要目标 (由于visual studio通常包含很多开发环境,通常将其中c/c++的ide称为visual c++ 20xx) 整理下visual c++ 2010下预定义的宏.做一下备忘和了解,在实际编码中可以考虑使用部分宏作为判断标准. 主要参考链接:http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.100).aspx 二.vc++ 2010中预定义宏 注意本文中提及的所有预定义宏都是无参数的,并且不能重定义. 1. __FIL

gcc中预定义的宏__GNUC__

今天在看Linux系统编程这本书的代码的时候看到了__GNUC__,不太清楚这个宏所以去查了一下,以此记录.GNU C预定义了一系列的宏,这些宏都是以双下划线开始的,这里只讲一下__GNUC__  __GNUC_MINOR__ __GNUC_PATCHLEVEL__,其他GNU C的预定义宏可以到这里查看: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/cpp/Common-Predefined-Macros.html#Common-Predefined-Ma

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

C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __FILE__ 代表当前源代码文件名的字符串文字 __LINE__ 代表当前源代码中的行号的整数常量 __TIME__ 源文件编译时间,格式微“hh:mm:ss” __func__ 当前所在函数名 对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因

C标准中一些预定义的宏(例如__func__等)

C标准中一些预定义的宏 C标准中指定了一些预定义的宏,对于编程经常会用到.下面这个表中就是一些常常用到的预定义宏. 宏 意义 __DATE__ 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字) __FILE__ 代表当前源代码文件名的字符串文字 __LINE__ 代表当前源代码中的行号的整数常量 __TIME__ 源文件编译时间,格式微“hh:mm:ss” __func__ 当前所在函数名 对于__FILE__,__LINE__,__func__这样的宏,在调试程序时是很有用的,因

C语言的代码内存布局详解

一个程序本质上都是由 BSS 段.data段.text段三个组成的.这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题. BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段:在采用段式内存管理的架构中,数据段(da

C语言之内存分配例题详解

1.C中内存分为四个区 栈:用来存放函数的形参和函数内的局部变量.由编译器分配空间,在函数执行完后由编译器自动释放.  堆:用来存放由动态分配函数(如malloc)分配的空间.是由程序员自己手动分配的,并且必须由程序员使用free释放.如果忘记用free释放,会导致所分配的空间一 直占着不放,导致内存泄露.  全局:用来存放全局变量和静态变量.存在于程序的整个运行期间,是由编译器分配和释放的.  例1. 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值.     int n;

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

C/c++几个预定义的宏:__DATE__,__TIME__,__FILE__,__LINE__

一边情况下,C/C++编译器会内置几个宏,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1: __cplusplus:当编写C++