神秘的C ++语法

时间:2012-11-17 22:08:19

标签: c++

我正在试图了解一个使用内在速度的卡方程序。在这个过程中,我遇到了一些我无法理解的代码。

我已经尝试过检查教科书,谷歌和搜索这个网站没有运气。我认为问题在于,在不了解语法的情况下,我无法用术语或关键词充分描述搜索,以获得任何相关结果。

以下是我不理解的代码行:

float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;

以下是包含它的函数:

float chi2_float(const int dim, const float* const x, const float* const y) {
    float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
#ifdef __SSE__
    chi2_float = chi2_intrinsic_float;
#endif
    return chi2_float(dim, x, y);
}

在我看来,它可能是声明和定义一个函数,当我注释掉该行并重新编译时,我得到:

错误C2659:'=':作为左操作数运行 在线     chi2_float = chi2_intrinsic_float;

如果需要,我可以发送包含此函数的.h文件,但它与参数一样。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:11)

有问题的行是将函数指针的变量设置为另外两个函数之一,具体取决于__SSE__的值。

然后调用chi2_float指向的函数并返回结果。

答案 1 :(得分:7)

此:

float (*chi2_float)(const int, const float*, const float*)= chi2_baseline_float;

声明一个函数指针名chi2_float,并为其指定一个指向名为chi_baseline_float的函数的指针。

然后,如果定义了__SSE__宏,则使用指向函数chi2_intrinsic_float的指针重新分配指针。

所有这些的净效果类似于:

float chi2_float(const int dim, const float* const x, const float* const y) 
{
#ifdef __SSE__
    return chi2_intrinsic_float(dim, x, y);
#else
    return chi2_baseline_float(dim, x, y);
#endif
}

答案 2 :(得分:1)

您的问题代码中有一些评论:

// beginning of the definition of function chi2_float 
float chi2_float(const int dim, const float* const x, const float* const y) {
    // declare the variable chi2_float as a function pointer
    // set variable chi2_float to the address of the function chi2_baseline_float
    float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
// if macro __SSE__ is defined (if the compiler enables SSE instructions set)
// [this is your case because you got an error in the below line when you have commented the above line] 
#ifdef __SSE__
    // then preprocessor adds the following line that sets again the variable chi2_float (but to another function) 
    chi2_float = chi2_intrinsic_float;
#endif
    // call the function pointed by the variable chi2_float
    return chi2_float(dim, x, y);
}

答案 3 :(得分:1)

float chi2_float(const int dim, const float* const x, const float* const y) {
   float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
#ifdef __SSE__
   chi2_float = chi2_intrinsic_float;
#endif
   return chi2_float(dim, x, y);
}

难看。

修复此代码的第一件事是使用函数名以外的函数作为函数指针变量的名称。我认为,这个变量影响了函数的名称是詹姆斯·克劳混淆的源头。

修复此代码的第二件事是完全摆脱函数指针,导致代码Michael Burr在他的回答中发布。

答案 4 :(得分:1)

Michael Burr建议如下:

float chi2_float(const int dim, const float* const x, const float* const y) 
{
#ifdef __SSE__
    return chi2_intrinsic_float(dim, x, y);
#else
    return chi2_baseline_float(dim, x, y);
#endif
}

暂时忽略编译器的优化器;这可能会有所改善。 Burr先生的解决方案使用两个函数调用:main()(或其他)调用chi2_float()然后调用适当的实现。这可以简化为只有一个函数调用,具有以下内容:

#ifdef __SSE__
    #define chi2_float(dim, x, y) chi2_intrinsic_float(dim, x, y)
#else
    #define chi2_float(dim, x, y) chi2_baseline_float(dim, x, y)
#endif

通过宣布伯尔先生的chi2_float()为" inline"可能会取得同样的结果。

然而,回到现实世界(编译器积极优化代码),你会期望一个好的优化器去除额外的函数调用,从而使Burr先生的解决方案同样快。

我发布此讨论是为了完整性。虽然这并没有改善Burr先生的解决方案,但它增加了更多的背景。从技术上讲,它应该是一个评论,而不是一个新的答案,但是在评论中格式化源代码是不可能的。这就是生活。