错误:“预期”(’字符串常量之前’

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

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

#include  #include  #include  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; } 

extern "C"无效C(它仅在C ++中有效)。 如果您在纯C工作,请将其删除

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

错误:“预期”(’字符串常量之前’

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

但是,如果您(或其他人)混合使用C和C ++源文件,则可以使用宏__cplusplus__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) )。

第一行应该是: extern C;

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