我的代码只用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
答案 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。