关于c ++:extern“C”导致错误“expected”(’在字符串常量之前’

extern “C” causing an error “expected '(' before string constant”

本问题已经有最佳答案,请猛点这里访问。

文件1.C

1
2
3
4
int add(int a, int b)
{
  return (a+b);
}

文件2.CPP

1
2
3
4
5
6
void main()
{
    int c;

    c = add(1,2);
}

H1.H

1
2
3
4
5
6
extern"C"  {

#include"stdio.h"

int add(int a,int b);
}

案例1:当我在file1.c文件中包含h1.h时,gcc编译器会抛出一个错误"expected"("before string constant")。

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

问题:

1)这是否意味着我不能在C中包含带有外部"C"函数的头文件??

2)是否可以在外部"C"中包含标题,如下所示

1
2
3
4
5
extern"C" {

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

3)我能用外部的"C"把头函数文件中的C++函数定义放在C文件中吗?

例如

A.cpp(cpp文件)

1
2
3
4
void test()
{
   std::printf("this is a test function");
}

A.H(头文件)

1
2
3
extern"C" {
void test();
}

B_c.c(C文件)

1
2
3
4
5
6
#include"a.h"

void main()
{
  test();
}


这样写A.H:

1
2
3
4
5
6
7
8
9
10
11
#pragma once
#ifdef __cplusplus
extern"C"
{
#endif

int add(int a,int b);

#ifdef __cplusplus
}
#endif

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


由于外部"C"不被C编译器理解,所以需要创建一个头,它既可以包含在C文件中,也可以包含在C++文件中。

例如。

1
2
3
4
5
#ifdef __cplusplus
extern"C" int foo(int,int);
#else
int foo(int,int);
#endif