使用g ++编译c和c ++文件

时间:2017-10-25 02:28:04

标签: c++ c g++

我正在尝试编译C和C ++文件并将它们链接在一起。我正在关注此链接的答案 - Compiling C and C++ files together using GCC

但是我有一个不同的问题,在该帖子中没有解释。我已经在C ++文件中定义了我的main()并使用了一个函数,其详细信息在C文件中。该函数的声明存在于.h文件中,该文件包含在C和C ++文件中。

我的C ++文件 -

#include<iostream>
#include<testc.h>

using namespace std;

extern "C" void cfunc(int, int);

int main()
{
    cout<<"Hello from cpp"<<endl;
    cfunc(3,6);
}

我的C档案 -

#include<stdio.h>
#include<testc.h>

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

void cfunc(int a, int b)
{
    printf("Hello from c %d\n",cfunc2(a,b));
}

我的.h文件 -

int cfunc2(int, int);
void cfunc(int, int);

根据其他帖子,如果我在C ++代码中使用C函数,我需要在我的C ++文件中给出以下定义 -

extern "C" void cfunc(int, int);

然而,当我这样跑的时候,我得到以下错误 -

testcpp.cpp:6:17:  error: conflicting declaration of ‘void cfunc(int, int)’ with ‘C’ linkage
extern "C" void cfunc(int, int);

In file included from testcpp.cpp:2:0:
inc/testc.h:9:6: note: previous declaration with ‘C++’ linkage
void cfunc(int, int);

testcpp.cpp是我从main调用的地方,testc.c包含函数定义,testc.h是头文件。

我运行以下命令集 -

gcc -c -std=c99 -o testc.o testc.c -Iinc
g++ -c -std=c++0x -o testcpp.o testcpp.cpp -Iinc
g++ -o myapp testc.o testcpp.o

inc文件夹包含.h文件

我做错了什么?

1 个答案:

答案 0 :(得分:4)

.h文件中声明该函数之后,您不需要在C ++文件中提供该函数的另一个声明(并且在C ++中包含此文件,因为它出现) 。这就是C ++编译器明显抱怨的内容,因为它们不同。

相反,要么将声明包装在.h文件中,如下所示:

 #ifdef __cplusplus
 extern "C" {
 #endif

 < your declarations go here >

 #ifdef __cplusplus
 }
 #endif

#include文件中以相同的方式包装.cpp行:

 extern "C" {
 #include "testc.h"
 }

这个想法是C和C ++部分需要看到以不同方式声明的相同函数。这就是#ifdef文件中需要.h的原因,因为它包含在C和C ++中。