带有两个圆括号对的 C 函数?

C functions with two round brackets pairs?

对于不好的标题,我深表歉意,但除了 "I don't understand this code" 之外,我没有想到更好的了。请随时提出修改意见。

我正在阅读 this 代码。我从未见过像这样的 C 函数:

static void
VL_XCAT(_vl_vlad_encode_, SFX)
(TYPE * enc,
 TYPE const * means, vl_size dimension, vl_size numClusters,
 TYPE const * data, vl_size numData,
 TYPE const * assignments,
 int flags)
{
    // function body
}

特别是我对 (_vl_vlad_encode_, SFX) 感到困惑。据了解,我见过的函数headers只有一个"pair of round brackets"(函数的参数),而这里有两对

第一个是什么意思?我认为这与以后的调用 _vl_vlad_encode_f_vl_vlad_encode_d 相关联,它们不会出现在库代码的其他任何地方,但我不明白它们是如何连接的。

VL_XCAT 是一个宏,通常用于连接两个标记。 (A ## B) 这意味着它将根据两个参数创建一个标记,即: _vl_vlad_encode_SFX - 可能是为使用的浮点变量类型定义的 (double/float)

我会说这将在 double 和 float 函数之间选择使用和使用 _vl_vlad_encode_f_vl_vlad_encode_d 基于定义。

所以如果

#define SFX d

它将在处理完这一行后创建 _vl_vlad_encode_d

VL_XCATVL_CAT 类似函数的宏位于 vl/host.h(与您链接的 vlad.c 文件相同的目录)。

VL_CAT(x,y) 简单地连接它的参数和 VL_XCAT(x,y) 是一样的,除了它的参数是宏扩展的:

#define VL_CAT(x,y) x##y
#define VL_XCAT(x,y) VL_CAT(x, y)

VL_XCAT(_vl_vlad_encode_, SFX) 结果为 _vl_vlad_encode_f_vl_vlad_encode_d,具体取决于 SFX 的定义方式。

所以你最终会得到这样的结果,例如当使用#define SFX d时(注意#define TYPE double同时处于活动状态):

static void
_vl_vlad_encode_d
(double * enc,
 double const * means, vl_size dimension, vl_size numClusters,
 double const * data, vl_size numData,
 double const * assignments,
 int flags)
{
    // function body
}

现在看起来像一个正常的函数定义,不是吗?