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

时间:2012-04-25 00:16:55

标签: c

计算数组中值的几何平均值

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

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

3 个答案:

答案 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 ...