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

Ela*_*nda 1 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_)
Run Code Online (Sandbox Code Playgroud)

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

如何评估?

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

Lor*_*ica 6

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

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

#define  is_module_error(_module_,_error_)    \
   ((_module_##_errors<_error_)&&(_error_<_module_##_errors_end))
Run Code Online (Sandbox Code Playgroud)

应解释为:

#define  is_module_error(_module_,_error_)  ((_module_##_errors<_error_)&&(_error_<_module_##_errors_end))
Run Code Online (Sandbox Code Playgroud)

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

6.10预处理指令

[...]

描述

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

强调相关的句子是我的.

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

6.10.3.3 ##运算符

[...]

语义

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

在这种情况下,这意味着,例如,预处理器找到以下宏"调用"的任何地方:

is_module_error(dangerous_module,blow_up_error)
Run Code Online (Sandbox Code Playgroud)

它将用这个代码片段替换它:

((dangerous_module_errors<blow_up_error)&&(blow_up_error<dangerous_module_errors_end))
Run Code Online (Sandbox Code Playgroud)

  • 第二句,"编译器"应该是"预处理器".在编译器在翻译单元上获得它之前很久就已经结束了. (2认同)