1
#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_)

Can someone please explain to me what does the first define means?

How is is evaluated?

I don't understand what's the \ sign mean here?

4

1 回答 1

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 预处理指令

[...]

描述

预处理指令由满足以下约束的预处理标记序列组成:序列中的第一个标记是#预处理标记,(在翻译阶段 4 开始时)是源文件中的第一个字符(可选在空格之后)不包含换行符)或后面的空格包含至少一个换行符。序列中的最后一个标记是序列中第一个标记之后的第一个换行符。换行符结束预处理指令,即使它出现在调用类似函数的宏中。

强调相关句子是我的。

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

6.10.3.3 ## 运算符

[...]

语义

如果在类函数宏的替换列表中,参数紧跟在##预处理标记之前或之后,则该参数将替换为相应参数的预处理标记序列;但是,如果参数不包含预处理标记,则该参数将替换为地标预处理标记。

在手头的情况下,这意味着,例如,无论预处理器在何处找到以下宏“调用”:

is_module_error(dangerous_module,blow_up_error)

它将用以下代码片段替换它:

((dangerous_module_errors<blow_up_error)&&(blow_up_error<dangerous_module_errors_end))
于 2013-09-08T09:30:40.317 回答