为什么我不能在main.cpp中包含C文件?

时间:2017-06-01 14:24:59

标签: c++ c

我的代码只用C编写。主要功能是main.c,它包含其他c文件,例如#include "Flash.h"

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

main.cpp

在编译时会产生250个错误 - 包含 c 文件

将主文件转换为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运行某些RF芯片): 大多数错误来自本节

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 个答案:

答案 0 :(得分:5)

C ++中的#include指令是源代码的字面包含。想象一下Flash.h中{C}}包含的C源代码,它做了与C ++不兼容的事情,如

main.c

现在,在你的typedef int class;

main.cpp

这就像您在C ++源文件中直接使用此代码#include "Flash.h" 一样 - 所以这是一个错误。

如果您的C源代码包含C标头,则根本不需要使用C ++!

如果要编写新的C ++代码并使其调用旧代码(反之亦然),只需使用链接器即可。让C ++代码包含C ++头文件,单独,C代码包含C头文件,链接器将所有代码组合成一个可执行文件。

要使C和C ++部分协同工作,您需要一个额外的头文件。例如,将其称为typedef int class;。然后将它包含在所有C和C ++源文件中:

c-cpp-interface.h

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

此文件应使用通用的C / C ++子集语言编写。也就是说,主要是C语言但类型安全性增加(例如,所有函数的原型必须完全写入,没有隐含的extern "C" { #include "c-cpp-interface.h" // in C++ files } 参数)。

理想情况下,您可以使用现有的C头文件。但是,C头文件经常累积,并且创建新文件可能比清理现有文件更实际。

查看您拥有的实际错误消息(使用...),您应该尝试在C-C ++界面中使用尽可能少的代码。不要在那里放置实现细节(比如各种常量的值)。只有那个由另一种语言调用的函数的声明/原型(C调用C ++,反之亦然)。

答案 1 :(得分:4)

你发布的问题指出你需要包装包含

console.log(data)

在你的情况下,

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

并且在每个想要使用C代码的cpp中,使用extern "C" { #include "Flash.h" } int main(void) { } 围绕include。