19

致力于计算数组中值的几何平均值

该函数应该正确计算地理平均值,但我收到一条奇怪的错误消息

#include <stdio.h>
#include <stdint.h>
#include <math.h>


extern "C"

double geomean(double myarray[], int count)      ////error here, expected '(' before string constant
{
double geomean = 1;
double root = (1/(double)count);    
int i;
for(i = 0; i < count; i++)
    {
        geomean = geomean * myarray[i];
    }
geomean = pow(geomean, root);
return geomean;
}
4

3 回答 3

30

extern "C"不是有效的 C(仅在 C++ 中有效)。如果您在纯 C 中工作,只需将其删除。

于 2012-04-25T00:19:26.063 回答
22

我正在回答这个问题,试图涵盖更详细的答案中可能涵盖的内容,以帮助提问者或其他访问此页面的人。

错误:“字符串常量前应为 '('”</p>

正如您问题的其他答案中提到的,extern "C"不是有效的 C(它仅在 C++ 中有效)。如果您仅使用纯 C,则可以将其删除。

但是,如果您(或其他人)混合了 C 和 C++ 源文件,那么您可以使用宏__cplusplus__cplusplus将为通过 C++ 编译器运行的任何编译单元定义宏。通常,这意味着 .cpp 文件和该 .cpp 文件包含的任何文件。

因此,如果不同的编译单元包含相同的 .h(或 .hh 或 .hpp 或 what-have-you),则可以在不同时间将它们解释为 C 或 C++。如果您希望 .h 文件中的原型引用 C 符号名称,那么它们在被解释为 C++ 时必须具有 extern "C" ,并且在被解释为 C 时它们不应具有 extern "C" (如您的情况你得到一个错误!)。

#ifdef __cplusplus
  extern "C" {
#endif

// Your prototype or Definition 
#ifdef __cplusplus
  }
#endif

注意:extern "C"所做的只是影响链接。C++ 函数,在编译时,它们的名字被弄乱了。这就是使重载成为可能的原因。函数名称会根据参数的类型和数量进行修改,因此具有相同名称的两个函数将具有不同的符号名称。

如果您包含具有 C 链接的代码的标头(例如由 C 编译器编译的代码),那么您必须extern "C"包含标头 - 这样您就可以与库链接。( Otherwise, your linker would be looking for functions with names like _Z1hic when you were looking for void h(int, char))。

于 2016-11-08T08:39:52.013 回答
-4

第一行应该是:extern C;

另一种选择是在没有关键字c的情况下在主函数之外声明......extern

于 2012-04-25T08:00:23.860 回答