我有用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发布于 2017-06-01 14:38:25
#include指令在C++中是源代码的字面包含。想象一下,Flash.h中的C源代码包括在main.c中,做一些与C++不兼容的事情,比如
typedef int class;现在,在你的main.cpp里
#include "Flash.h"这与直接将此代码typedef int class;放在C++源文件中完全一样--所以这是一个错误。
如果您有带有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头文件常常累积cruft,创建一个新文件可能比清理现有文件更实用。
查看实际的错误消息(使用offsetof),您应该尽可能少使用C- C++接口中的代码。不要将实现细节(比如各种常量的值)放在那里。只有其他语言调用的函数的声明/原型(C调用C++,反之亦然)。
发布于 2017-06-01 14:29:13
您发布的问题指出,您需要包装包含的内容。
extern "C" {
#include "cheader.h"
}在你的情况下
extern "C" {
#include "Flash.h"
}
int main(void)
{
}在每个想要使用C代码的cpp中,在包含部分周围使用extern "C"。
https://stackoverflow.com/questions/44310197
复制相似问题