我正在尝试了解其中一个VPP sample功能名称' sample_plugin_api_hookup'。宏(#define _(N,n)
)中下划线(' _')的目的是什么?
#define _(N,n) \
vl_msg_api_set_handlers((VL_API_##N + sm->msg_id_base), \
#n, \
vl_api_##n##_t_handler, \
vl_noop_handler, \
vl_api_##n##_t_endian, \
vl_api_##n##_t_print, \
sizeof(vl_api_##n##_t), 1);
foreach_sample_plugin_api_msg;
#undef _
答案 0 :(得分:3)
_
是一个有效的C标识符,但它保留用于文件范围。 C标识符由字母或下划线组成,后跟零个或多个字母,下划线或数字(我忽略了通用字符名称)。
显然,该代码的作者想要一个简短,易于输入且不引人注目的名称。我相信GNU gettext包或使用它的代码遵循这个约定,使用像
这样的宏调用 _("This is a message")
被替换为本地化版本的邮件。 (这意味着使用GNU gettext的程序可能需要选择不同的名称)。
foreach_sample_plugin_api_msg
是另一个使用_
宏的宏,这就是为什么_
宏在该行之后不会立即定义的原因。
也许作者受到Go语言的影响,该语言使用_
作为空白标识符。
关于这是一个巧妙的伎俩还是反对良好品味的犯罪问题,意见可能会有所不同。