【发布时间】:2017-06-01 14:24:59
【问题描述】:
我只有用 C 语言编写的代码。主函数为main.c,包含#include "Flash.h"等其他c文件。
我想保持项目正常运行,但能够添加 cpp 文件。
有人告诉我,我必须将 main 更改为
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
【问题讨论】:
-
C 和 C++ 仍然是两种截然不同的语言,你不能指望为 C 编译器编写的头文件可以完美地与 C++ 编译器一起编译。
-
为什么要混合 C 和 C++?难怪它不编译。您必须改用
main.c。 -
@Curnelious 这并不一定很糟糕,但你必须小心编译。仔细阅读您添加到帖子中的链接。您应该将 C 代码编译为 C,将 C++ 代码编译为 C++,然后适当地链接它们。
-
如果您的
Flash.h是公开的,请至少提供一些链接。否则,给出一些错误消息并将它们周围的几行Flash.h复制并粘贴到您的问题中。我们无法猜测您的错误消息。 -
@Curnelious 你真的不需要消极对待这些东西。人们在告诉你如何改进你的问题,以便得到解答。您应该在问题中添加的这些内容非常重要。你在做正确的事,包括他们。