带有两个圆括号对的 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_XCAT
和 VL_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
}
现在看起来像一个正常的函数定义,不是吗?
对于不好的标题,我深表歉意,但除了 "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_XCAT
和 VL_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
}
现在看起来像一个正常的函数定义,不是吗?