首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能在main.cpp中包括C文件?

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

Stack Overflow用户
提问于 2017-06-01 14:24:59
回答 2查看 2.6K关注 0票数 0

我有用C写的代码。主要函数是main.c,它包括其他c文件,如#include "Flash.h"

我希望保持项目的工作,但能够添加一个cpp文件。我被告知我必须改变主旋律

代码语言:javascript
复制
main.cpp

,这将在编译时产生250个与所包含的c++文件有关的错误。

将主文件转换为cpp并仍然包含C文件的正确方法是什么?

main.cpp:

代码语言:javascript
复制
#include "Flash.h"
int main(void)
{
....
}

我读过How to use C source files in a C++ project?,它没有为我提供一个直接解决问题的方法(我的编译器无论如何都会使用c++ )。

编辑

在有人问我(不知道你为什么这么咄咄逼人)之前,我只犯了3种错误250次:

代码语言:javascript
复制
'->' 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芯片运行):大部分错误来自于本节,

代码语言:javascript
复制
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.*/

在这些行中,同样的错误重复:

代码语言:javascript
复制
a cast to a type other than an integral or enumeration type cannot appear in a constant-expression
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-01 14:38:25

#include指令在C++中是源代码的字面包含。想象一下,Flash.h中的C源代码包括在main.c中,做一些与C++不兼容的事情,比如

代码语言:javascript
复制
typedef int class;

现在,在你的main.cpp

代码语言:javascript
复制
#include "Flash.h"

这与直接将此代码typedef int class;放在C++源文件中完全一样--所以这是一个错误。

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

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

要使C部件和C++部件协同工作,需要一个额外的头文件。例如,将其命名为c-cpp-interface.h。然后将其包含在所有C和C++源文件中:

代码语言:javascript
复制
#include "c-cpp-interface.h" // in C files

代码语言:javascript
复制
extern "C" {
    #include "c-cpp-interface.h" // in C++ files
}

该文件应该用通用的C/C++子集语言编写。也就是说,大多数情况下是C语言,但具有更高的类型安全性(例如,所有函数的原型都必须完整地编写,不需要隐含的...参数)。

理想情况下,可以使用现有的C头文件。但是,C头文件常常累积cruft,创建一个新文件可能比清理现有文件更实用。

查看实际的错误消息(使用offsetof),您应该尽可能少使用C- C++接口中的代码。不要将实现细节(比如各种常量的值)放在那里。只有其他语言调用的函数的声明/原型(C调用C++,反之亦然)。

票数 5
EN

Stack Overflow用户

发布于 2017-06-01 14:29:13

您发布的问题指出,您需要包装包含的内容。

代码语言:javascript
复制
extern "C" {
#include "cheader.h"
}

在你的情况下

代码语言:javascript
复制
extern "C" {
#include "Flash.h"
}
int main(void)
{
}

在每个想要使用C代码的cpp中,在包含部分周围使用extern "C"

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44310197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档