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

use*_*632 15 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;
}
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 27

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


abh*_*ora 12

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

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

正如你问题的其他一些答案所提到的那样,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
Run Code Online (Sandbox Code Playgroud)

注意:所有这些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)).