#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