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

标签 c++ c

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

我想让项目继续运行,但要能够添加一个 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++ 中的#include 指令是源代码的字面包含。想象一下 main.c 包含的 Flash.h 中的 C 源代码正在做一些与 C++ 不兼容的事情,比如

typedef int class;

现在,在您的 main.cpp 中有

#include "Flash.h"

这就好像您直接在 C++ 源文件中有这段代码 typedef int class; - 所以这是一个错误。


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

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


要使您的 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 语言,但类型安全性更高(例如,所有函数的原型(prototype)必须完整编写,没有隐含的 ... 参数)。

理想情况下,您现有的 C 头文件可以这样使用。但是,C 头文件通常会堆积成堆的东西,创建一个新文件可能比清除现有文件更实用。


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

关于c++ - 为什么我不能在 main.cpp 中包含 C 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44310197/

相关文章:

c - 我正在尝试创建一个打开文件以在 C 中读取的函数

c - array [] vs pointer * - 为什么第一个代码在 C 中会失败?

c - 使用 C 程序启动和终止 cu

c - 如何索引包含指向结构指针的指针的结构,该结构是 malloc block

c++ - c++中动态分配的链表。发生异常后如何防止内存泄漏?

C++ 继承、模板和覆盖

java - 通过 JNI 从 C++ 获取 java 数组

c - C中基于数组的队列逻辑

c++ - 使用address-of运算符来匹配指针参数类型?

c++ - 字符串和字符元素