计算数组中值的几何平均值
该函数应该正确计算地理平均值,但我得到一个奇怪的错误消息
#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;
}
答案 0 :(得分:26)
extern "C"
无效C(它仅在C ++中有效)。如果您使用的是纯C,请将其删除。
答案 1 :(得分:10)
我正在回答这个问题,试图涵盖更详细的答案,以帮助提问者或访问此页面的其他人。
错误:“expected'('在字符串常量之前'
正如您在问题的其他答案中所提到的,extern "C"
无效C(它仅在C ++中有效)。如果您只使用纯C,则可以将其删除。
但是,如果您(或其他人)混合使用C和C ++源文件,则可以使用宏__cplusplus
。将为通过C ++编译器运行的任何编译单元定义__cplusplus
宏。通常,这意味着.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)
)。
答案 2 :(得分:-3)
第一行应为:extern C;
另一个选项是在没有c
关键字的主函数之外声明extern
...