使用`\`符号在cpp中不清楚#define语法

时间:2013-09-08 09:27:54

标签: c++ c c-preprocessor

#define  is_module_error(_module_,_error_)    \
   ((_module_##_errors<_error_)&&(_error_<_module_##_errors_end))

#define  is_general_error(_error_)     is_module_error(general,_error_)
#define  is_network_error(_error_)     is_module_error(network,_error_)

有人可以向我解释第一个定义的含义是什么吗?

如何评估?

我不明白这里的\标志是什么意思?

1 个答案:

答案 0 :(得分:6)

反斜杠是预处理程序指令中使用的行继续符号。它告诉预处理器将以下行与当前行合并。换句话说,它逃脱了行尾的硬换行。

在具体示例中,它告诉预处理器

#define  is_module_error(_module_,_error_)    \
   ((_module_##_errors<_error_)&&(_error_<_module_##_errors_end))

应解释为:

#define  is_module_error(_module_,_error_)  ((_module_##_errors<_error_)&&(_error_<_module_##_errors_end))

C99标准草案(N1256)的相关引用如下:

  

6.10预处理指令

     

[...]

     

<强>描述

     

预处理指令由一系列令人满意的预处理令牌组成   以下约束:序列中的第一个标记是#预处理标记(at   转换阶段4)的开始是源文件中的第一个字符(可选)   在不包含换行符的白色空格之后或在空格之后   包含至少一个换行符。 序列中的最后一个标记是序列中第一个标记后面的第一个换行符。 换行符结束   预处理指令,即使它发生在一个函数式宏的调用之内。

强调相关的句子是我的。

如果您还不确定##符号的含义,那就是令牌粘贴操作符。从已经引用的C99文件(强调我的):

  

6.10.3.3 ##运算符

     

[...]

     

<强>语义

     

如果在类似函数的宏的替换列表中,紧接着一个参数   或者后跟一个##预处理令牌,该参数将被相应的替换   参数的预处理标记序列 ;但是,如果参数不包含预处理标记,则参数将替换为地标标记预处理标记。

在这种情况下,这意味着,例如,预处理器找到以下宏“call”的地方:

is_module_error(dangerous_module,blow_up_error)

它将替换为此代码片段:

((dangerous_module_errors<blow_up_error)&&(blow_up_error<dangerous_module_errors_end))