' _'的目的是什么?在宏观中

时间:2017-12-05 23:27:43

标签: c macros

我正在尝试了解其中一个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 _

1 个答案:

答案 0 :(得分:3)

_是一个有效的C标识符,但它保留用于文件范围。 C标识符由字母或下划线组成,后跟零个或多个字母,下划线或数字(我忽略了通用字符名称)。

显然,该代码的作者想要一个简短,易于输入且不引人注目的名称。我相信GNU gettext包或使用它的代码遵循这个约定,使用像

这样的宏调用
 _("This is a message")

被替换为本地化版本的邮件。 (这意味着使用GNU gettext的程序可能需要选择不同的名称)。

foreach_sample_plugin_api_msg是另一个使用_宏的宏,这就是为什么_宏在该行之后不会立即定义的原因。

也许作者受到Go语言的影响,该语言使用_作为空白标识符

关于这是一个巧妙的伎俩还是反对良好品味的犯罪问题,意见可能会有所不同。