C语言宏替换#define中的#和##以及\

1 #替换

在#define中,有两个特殊的符号,他们是#和##

// 下面含义代表name的真实含义
#name 

具体过程:
1. 现在name左右加上引号,表达成字符串
2. 将name换成真实的实参

例如

#define MYREPLACE(dir) #dir "/%s"        // # 替换

printf("%s\n", MYREPLACE(/usr/local));

Output,输出

/usr/local/%s

注意:两个字符串挨在一起,会自动串在一起。

2 ##连接

下面来自Boost中operators.hpp一句代码,
通过宏定义来产生一个name_2left从结果很容易看出##的作用是用来连接左右两边

// A macro which produces "name_2left" from "name".
#define BOOST_OPERATOR2_LEFT(name) name##2##_##left

因此,这种方式增强了宏替换的灵活性,而不是死死的替换。

3 \代表是一行代码

下面的代码,不需要是干嘛的,只需要关心每行的\
有这个符号的表示一行代码,如下将所有的代码连成一行,换句话说,这个宏BOOST_BINARY_OPERATOR代表两个模板结构体哈

#define BOOST_BINARY_OPERATOR( NAME, OP ) template <class T, class U, class B = operators_detail::empty_base<T> >struct NAME##2 : B .......
#define BOOST_BINARY_OPERATOR( NAME, OP )                               \
template <class T, class U, class B = operators_detail::empty_base<T> > \
struct NAME##2 : B                                                      \
{                                                                       \
  friend T operator OP( const T& lhs, const U& rhs )                    \
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                        \
};                                                                      \
                                                                        \
template <class T, class B = operators_detail::empty_base<T> >          \
struct NAME##1 : B                                                      \
{                                                                       \
  friend T operator OP( const T& lhs, const T& rhs )                    \
    { T nrv( lhs ); nrv OP##= rhs; return nrv; }                        \
};

4 其他预处理命令

C语言预处理命令#line、#error、#pragma、#ifndef等
https://blog.csdn.net/weixin_39956356/article/details/112004013

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值