C预处理器-运算符与变参宏

titledatetagscategoriesdescription
C预处理器
2020-04-05 02:14:39 -0700
预处理
变参宏
C语言

关于预处理的基础学习

#运算符

#作为一个预处理运算符,可以把记号转换成字符串,例如,如果x是一个宏形参,那么#x就是转换为字符串"x"的形参名

#include <stdio.h>
#define PR1(x) printf("your input is " #x)
int main(void)
{
    PR1(1);
}

输出

your input is 1

字符串串联功能将"your input is ""1"两个相邻的字符串合并成了一个字符串

##运算符

##运算符把两个记号组合成一个记号,例如

#include <stdio.h>
#define XNAME(n) x##n
#define PR(n) printf("x" #n "=%d\n", x##n)
int main(void)
{
    int XNAME(1) = 100;
    int x2 = 200;
    PR(1);
    PR(2);
    return 0;
}

XNAME(1)将展开为x1

变参宏

C99/C11提供了接收可变参数的工具,通过把宏参数列表中最后的参数写成省略号(即三个点...)来实现这一功能,这样预定义宏__VA_ARGS__可用在替换部分中,表明省略号代表什么 例如下面的定义

#include <stdio.h>
#define PR_VA(...) printf(__VA_ARGS__)
int main(void)
{
    int x1 = 100;
    int x2 = 200;
    PR_VA("x1 = %d, x2 = %d\n", x1, x2);
    return 0;
}

__VA_ARGS__将展开为三个参数,"x1 = %d, x2 = %d\n"x1x2三个参数 记住,省略号只能代替最后的宏参数

defined预处理符

#ifdef A可使用#if defined(A)来替代 #ifndef A可使用#if !defined(A)来替代 使用这种方法的优点是可以和#elif一起使用,而前一种不行

#if defined(IBMPC)
    #include "ibmpc.h"
#elif defined(VAX)
    #include "vax.h"
#elif defined(MAC)
    #include "mac.h"
#else
    #include "general.h"
#endif

预定义宏

C标准规定了一些预定义宏

含义
__DATE__字符串,预处理日期,mm dd yyyy格式,如Nov 15 2018
__FILE__字符串,当前源代码文件名
__LINE__整型,当前行号
__STDC__当被设置为1时,表名严格遵循C标准
__STDC_HOSTED__本机环境设置为1,否则为0
__STDC_VERSION__长整型,支持C99,设置为199901L,支持C11,设置为201112L
__TIME__字符串,翻译代码的时间,格式hh:mm:ss
__func__字符串,当前函数名

#line和#error

#line用于重置__LINE____FILE__宏报告的行号和文件名

#line 1000          //把当前行号重置为1000
#line 10 "cool.c"   //把行号重置为10,文件名重置为cool.c

#error用于发布一条错误信息

//检测C标准
#if __STDC_VERSION__ != 201112L
#error NOT C11
#endif
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值