2017-06-01 57 views
0

我只有用C编写的代码。主要功能是main.c,它包括其他c文件,如#include "Flash.h"为什么我不能在main.cpp中包含C文件?

我想保持项目正常工作,但能够添加cpp文件。 有人告诉我,我必须要改变的主要是

main.cpp 

时将产生compilation- 250个错误对于包括Ç文件

什么是将主文件CPP的正确方法仍然包含C文件?

main.cpp中:

#include "Flash.h" 
int main(void) 
{ 
.... 
} 

我已阅读How to use C source files in a C++ project?这并没有给我提供一个直接的解决问题的方法(我的编译器将使用C++反正)。

编辑

之前有人会杀了我的要求(不知道为什么你这么激进的),我得到的只有3种错误250倍:

'->' cannot appear in a constant-expression 
'&' cannot appear in a constant-expression 
a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 

编辑2: 下面是一些线路(运行使用SDK的某些射频芯片): 大部分错误来自本节

typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ 
{ 
    NRF_GPIOTE_TASKS_OUT_0  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[0]), /**< Out task 0.*/ 
    NRF_GPIOTE_TASKS_OUT_1  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[1]), /**< Out task 1.*/ 
    NRF_GPIOTE_TASKS_OUT_2  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[2]), /**< Out task 2.*/ 
    NRF_GPIOTE_TASKS_OUT_3  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[3]), /**< Out task 3.*/ 
#if (GPIOTE_CH_NUM > 4) || defined(__SDK_DOXYGEN__) 
    NRF_GPIOTE_TASKS_OUT_4  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[4]), /**< Out task 4.*/ 
    NRF_GPIOTE_TASKS_OUT_5  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[5]), /**< Out task 5.*/ 
    NRF_GPIOTE_TASKS_OUT_6  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[6]), /**< Out task 6.*/ 
    NRF_GPIOTE_TASKS_OUT_7  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[7]), /**< Out task 7.*/ 

在这些线路上同样的错误重复:

a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
+2

C和C++仍然是两种截然不同的语言,您不能指望为C编译器编写的头文件用C++编译器完美编译。 –

+1

为什么混合使用C和C++?难怪它不会编译。您必须改用'main.c'。 – Rakete1111

+0

你使用什么编译器?有些会根据扩展名(例如'.c' vs'.cpp')自动检测语言(C vs C++)。它们确实是不同的语言,C语言程序不一定会编译为C++语言,因为语言差异很大。 – CoryKramer

回答

5

C++中的#include指令是文字包含的源代码。想象一下,在Flash.h C源代码中包含了由main.c做这样

typedef int class; 

一些与C++不兼容现在,在main.cpp你有

#include "Flash.h" 

这是完全一样,如果你直接在C有这个代码typedef int class; ++源文件 - 所以这是一个错误。


如果您有C头文件的C源代码,则根本不需要使用C++!

如果您想编写新的C++代码并使其调用旧代码(反之亦然),请使用链接器。 C++代码包含C++头文件,并分别使用,C代码包含C头文件,并且链接器将所有代码组合到可执行文件中。


为了使您的C和C++部件一起工作,您需要额外的头文件。例如称之为c-cpp-interface.h。然后将其包含在所有的C和C++源文件:

#include "c-cpp-interface.h" // in C files 

extern "C" { 
    #include "c-cpp-interface.h" // in C++ files 
} 

这个文件应该在一个共同的C/C++子集语言编写。也就是说,主要是C语言,但是具有更高的类型安全性(例如,所有功能的原型必须完全写入,而不包含暗示的参数...)。

理想情况下,您现有的C头文件可以这样使用。但是,C头文件经常会累积起来,创建新文件比清理现有文件更实用。


看着你(与offsetof)实际的错误信息,你应该尝试有在C尽可能少的代码尽可能 - C++接口。不要把实现细节(如各种常量的值)放在那里。只有那些被其他语言调用的函数(C调用C++,反之亦然)的声明/原型。

+0

如何“分开”?我有一个单一的项目,你能详细说明如何“分开”做这个吗?最后我有1个主文件,这个主文件应该使用C和C++,那么你会怎么做? – Curnelious

+0

你的项目应该有2个源文件'main.c'和'another.cpp'。我从来没有使用过C/C++系统,但“项目”的概念在所有系统中都很常见 - 一个项目是源文件的集合。 – anatolyg

+0

所以你有x.c和y.cpp,并且你有一个主文件。你想在main中使用x和y,你会怎么做?在某些情况下,它们必须相交,因为它是同一个项目,并且在那一点上,你必须将C包含到C++中,或者相反。 – Curnelious

4

您发表的问题指出,你需要用的inclues

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

在你的情况,

extern "C" { 
#include "Flash.h" 
} 
int main(void) 
{ 
} 

并且在每个cpp中wa nts使用C代码,使用extern "C"四舍五入。

+3

...但是'Flash.h'必须仍然是有效的C++。如果不是,除了“修复”标题外,没有其他办法。 'extern“C”'只是关闭/调整名称混乱;而已。它没有进入一种“C语言模式”。最终,除非'Flash.h'被设计用于C和C++,否则你不能这样做。他们是两种不同的语言。 –

+0

谢谢,刚刚尝试过,它没有工作,我有和以前一样的错误。我的main.cpp看起来像我向你展示的,包含少量头文件,我把它们全部放在extern C中,但它并没有帮助 – Curnelious

+0

@BoundaryImposition真的吗?哇,我确实有200个,他们真的很复杂,我不能改变他们,他们中的一些人是司机。那么我是否永远坚持使用C? – Curnelious

相关问题