extern" C"导致错误"预期'('在字符串常量之前"

时间:2017-04-25 06:11:00

标签: c++ c extern

file1.c中

if(xshippingpro.xshippingpro3==true) 
{ 
  $enabled=false; 

} 
else 
{ 
  $enabled=true;
} 

file2.cpp

int add(int a, int b)
{
  return (a+b);
}

h1.h

void main()
{
    int c;

    c = add(1,2);
}

案例1: 当我在 file1.c 文件中包含 h1.h 时,gcc编译器会抛出错误" expect'(' before string)恒定"

案例2: 当我在 file2.cpp 文件编译工作中成功包含 h1.h

问题:

1)这是否意味着我不能在带有extern" C"的C中包含头文件。功能呢?

2)我可以在extern中包含标题" C"如下所示

extern "C"  {

#include "stdio.h"

int add(int a,int b);
}

3)我可以将c ++函数定义放在带有extern" C"的头文件中。所以我可以在C文件中调用它?

例如

a.cpp(cpp文件)

extern "C" {

#include "abc.h"
#include "...h"
}

a.h(头文件)

void test()
{
   std::printf("this is a test function");
}

b_c.c(c档案)

extern "C" {
void test();
}

2 个答案:

答案 0 :(得分:3)

像这样编写a.h:

#pragma once
#ifdef __cplusplus
extern "C"
{
#endif

int add(int a,int b);

#ifdef __cplusplus
}
#endif

通过这种方式,您可以声明多个函数 - 不需要为每个函数添加前缀。 正如其他人所提到的:extern C是一个C ++的东西,所以它需要"消失"当被C编译器看到时。

答案 1 :(得分:1)

自从extern" C" C编译器无法理解您需要创建一个既可以包含在C和C ++文件中的标头。

E.g。

#ifdef __cplusplus
extern "C" int foo(int,int);
#else
int foo(int,int);
#endif