C语言-预定义宏

本文最后更新于:1 年前

标准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标准及其指定年月的修订补充,否则数值未定义

C++中还定义了 __cplusplus

C语言中的__FILE__、__LINE__和__DATE__等都在头文件#include<stdio.h>中

打印函数示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

/* 指定下一行的__LINE__为200,重点是line的下一行是200 */
#line 200

int main(void)
{
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);

return 0;
}

自定义的宕机函数中可使用到

1
2
3
#define CM_ASSERT(x) (MSCP_ASSERT((int)(x), __FILE__,__func__, __LINE__))
/* 平台实现的宕机函数 */
extern void MSCP_ASSERT(int x, const char *filename, const char *func, int line);