关于标准C语言的预定义宏【转】

标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。下面预定义宏表,被我抄了下来。

__LINE__  当前程序行的行号,表示为十进制整型常量
__FILE__  当前源文件名,表示字符串型常量
__DATE__转换的日历日期,表示为Mmm dd yyyy 形式的字符串常量,Mmm是由asctime产生的。
__TIME__ 转换的时间,表示"hh:mm:ss"形式的字符串型常量,是有asctime产生的。(asctime貌似是指的一个函数)
__STDC__ 编辑器为ISO兼容实现时位十进制整型常量
__STDC_VERSION__ 如何实现复合C89整部1,则这个宏的值为19940SL;如果实现符合C99,则这个宏的值为199901L;否则数值是未定义
__STDC_EOBTED__ (C99)实现为宿主实现时为1,实现为独立实现为0
__STDC_IEC_559__ (C99)浮点数实现复合IBC 60559标准时定义为1,否者数值是未定义
__STDC_IEC_559_COMPLEX__ (C99)复数运算实现复合IBC 60559标准时定义为1,否者数值是未定义
__STDC_ISO_10646__ (C99)定义为长整型常量,yyyymmL表示wchar_t值复合ISO 10646标准及其指定年月的修订补充,否则数值未定义

实现还经常定义其他宏用于传递环境信息,如进行程序编译工作的计算机类型。具体定义哪些宏值是由实现决定的,但是UNIX实现习惯上预定义unix。与内置宏不同的是,这些宏可以取消定义。标准C语言要求特定实现的宏名一下划线开头,加上大写字母或另一个下划线(unix宏不符合这个要求)。

实际运用,例:预定义宏可以在魔种错误消息中使用:
if(n|=m)fprintf(stderr,"Internal error;line %d,file 5s\n",__LINE__,__FILE__);

其他实现定义的宏可以分隔主机或特定目标代码。例如:Microsoft Visual C++定义__WIN32为1:
#ifdef __WIN32
      /*Code for Win32 environment*/
#endif

__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

时间: 2024-11-07 07:06:25

关于标准C语言的预定义宏【转】的相关文章

关于标准C语言的预定义宏

标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__  当前程序行的行号,表示为十进制整型常量__FILE__  当前源文件名,表示字符串型常量__DATE__转换的日历日期,表示为Mmm dd yyyy 形式的字符串常量,Mmm是由asctime产生的.__TIME__ 转换的时间,表示"hh:mm:ss"形式的字符串型常量,是有asctime产

C++预定义宏 C++ Predefined Macros

一.ANSI C标准预定义宏 __LINE__:在源代码中插入当前源代码行号: __FILE__:在源文件中插入当前源文件名: __DATE__:在源文件中插入当前的编译日期 __TIME__:在源文件中插入当前编译时间: __STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1,表明是标准的C程序: //__cplusplus:当编写C++程序时该标识符被定义,表明是标准的C++程序.(这个是VC的吧?) MSDN上的解释 Macro Description __DATE__ T

(一)预定义宏、__func__、_Pragma、变长参数宏定义以及__VA_ARGS__

作为第一篇,首先要说一下C++11与C99的兼容性. C++11将 对以下这些C99特性的支持 都纳入新标准中: 1) C99中的预定义宏 2) __func__预定义标识符 3) _Pragma操作符 4) 不定参数宏定义以及__VA_ARGS__ 5) 宽窄字符串连接 这些特性并不像语法规则一样常用,并且有的C++编译器实现也都先于标准地将这些特性实现,因此可能大多数程序员没有发现这些不兼容.但将这些C99的特性在C++11中标准化无疑可以更广泛地保证两者的兼容性.我们来分别看一下. 这次,

预定义宏_GNUC_ _MSC_VER

一.预定义__GNUC__宏 1 __GNUC__ 是gcc编译器编译代码时预定义的一个宏.需要针对gcc编写代码时, 可以使用该宏进行条件编译. 2 __GNUC__ 的值表示gcc的版本.需要针对gcc特定版本编写代码时,也可以使用该宏进行条件编译. 3 __GNUC__ 的类型是“int”,该宏被扩展后, 得到的是整数字面值.可以通过仅预处理,查看宏扩展后的文本. 示例: #include <assert.h> #include <stdio.h> #include <

预定义宏__GNUC__和_MSC_VER

一.预定义__GNUC__宏 1 __GNUC__ 是gcc编译器编译代码时预定义的一个宏.需要针对gcc编写代码时, 可以使用该宏进行条件编译. 2 __GNUC__ 的值表示gcc的版本.需要针对gcc特定版本编写代码时,也可以使用该宏进行条件编译. 3 __GNUC__ 的类型是"int",该宏被扩展后, 得到的是整数字面值.可以通过仅预处理,查看宏扩展后的文本. 示例: #include <assert.h> #include <stdio.h> #in

C++零食:使用Unicode版的预定义宏__FUNCTION__

在C++中支持一种预定义宏.比如: __FILE__: 就是当前源代码文件名 __LINE__: 就是当前源代码的行号 这些宏可以在printf等语句中直接作为字符串使用,调试的时候很方便. 如下代码所示: int _tmain(int argc, _TCHAR* argv[]) { printf("Line:%d", __LINE__); return 0; } 执行后如图: Line:12 为了方便使用,微软在VC中还定义了一些它特有的宏,如: __FUNCTION__:返回当前代

arm-linux-androideabi-gcc 预定义宏(编译器版本4.8)

打印方法: touch test.c arm-linux-androideabi-gcc -E -dM -c test.c >> marco_arm.txt #define __DBL_MIN_EXP__ (-1021) #define __HQ_FBIT__ 15 #define __UINT_LEAST16_MAX__ 65535 #define __ARM_SIZEOF_WCHAR_T 32 #define __ATOMIC_ACQUIRE 2 #define __SFRACT_IBIT

预定义宏的使用

<img src="http://img.blog.csdn.net/20141104112019008" alt="" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" /> 代码实例: #include <iostream> using namespace std; void show() {

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

1.预定义宏 对于预定义宏,相信大家并不陌生.为了方便处理一些有用的信息,预处理器定义了一些预处理标识符,也就是预定义宏.预定义宏的名称都是以"__"(两条下划线)开头和结尾的,如果宏名是由两个单词组成,那么中间以"_"(一条下划线)进行连接.并且,宏名称一般都由大写字符组成. 在日常项目编程中,预定义宏尤其对多目标平台代码的编写通常具有重大意义. 通过预定义宏,程序员使用"#ifdef"与"#endif"等预处理指令,就可使