extern"C"是将C代码转换为C++代码,还是仅允许编译器将C代码编译为C++代码?

我有一个小问题。

我认为使用 usingextern "C"会将 C 代码直接转换为 C++ 代码。

#ifdef __cplusplus
extern "C" {
#endif

ENUM_J1939_STATUS_CODES CAN_Send_Message(uint32_t ID, uint8_t data[], uint8_t delay);
ENUM_J1939_STATUS_CODES CAN_Send_Request(uint32_t ID, uint8_t PGN[], uint8_t delay);
bool CAN_Read_Message(uint32_t *ID, uint8_t data[]);

#ifdef __cplusplus
}
#endif

但是当我QSerialPort在这里上课时

#ifdef __cplusplus
extern "C" {
#endif
#include <QSerialPort>
ENUM_J1939_STATUS_CODES CAN_Send_Message(uint32_t ID, uint8_t data[], uint8_t delay);
ENUM_J1939_STATUS_CODES CAN_Send_Request(uint32_t ID, uint8_t PGN[], uint8_t delay);
bool CAN_Read_Message(uint32_t *ID, uint8_t data[]);

#ifdef __cplusplus
}
#endif

然后我得到了 500 个关于数据类型、命名空间和 C 没有的所有类型的 C++ 关键字的错误。

题:

在 QT 中。我必须确保我可以在.h文件中使用 C++ 类并且.h包含在.c文件中。但是现在,如果我这样做,我的 QT IDE 会显示 500 个错误。

有没有办法让 C 代码调用 C++ 代码或将 C 代码转换为 100% C++ 代码,而无需将文件重命名.c.cpp

我的目标是通过extern "C".c文件的标题内部使用 C 中的 C++ 功能,但这对我来说并不顺利。

编辑:

我尝试了一些方法,但这不起作用。我收到 500 个错误。

#include <QSerialPort>

#ifdef __cplusplus
extern "C" {
#endif

void QT_USB_set_serial_handler(QSerialPort* serial_port);
ENUM_J1939_STATUS_CODES QT_USB_Transmit(uint32_t ID, uint8_t data[], uint8_t DLC);
void QT_USB_Get_ID_Data(uint32_t *ID, uint8_t data[], bool* is_new_message);

#ifdef __cplusplus
}

这仅给出一个错误。

#ifdef __cplusplus
#include <QSerialPort>
extern "C" {
#endif

void QT_USB_set_serial_handler(QSerialPort* serial_port); <-- complaining here on QSerialPort keyword
ENUM_J1939_STATUS_CODES QT_USB_Transmit(uint32_t ID, uint8_t data[], uint8_t DLC);
void QT_USB_Get_ID_Data(uint32_t *ID, uint8_t data[], bool* is_new_message);

#ifdef __cplusplus
}

这根本没有错误。

#ifdef __cplusplus
#include <QSerialPort>
void QT_USB_set_serial_handler(QSerialPort* serial_port);
extern "C" {
#endif

ENUM_J1939_STATUS_CODES QT_USB_Transmit(uint32_t ID, uint8_t data[], uint8_t DLC);
void QT_USB_Get_ID_Data(uint32_t *ID, uint8_t data[], bool* is_new_message);

#ifdef __cplusplus
}

回答

extern "C" { ... }在 C++ 代码中使用C函数而不是 C++ 函数的外部函数的声明

extern "C" { ... }不会莫名其妙地“把C代码转换成C ++代码”。
它也不会将 C++ 代码转换为 C 代码。

您可以使用extern "C" { ... },当你有一些其他的功能的调用,而那些其他功能存在于结尾的源文件.c和编译为C,而不是C ++。 extern "C" { ... }确保您的 C++ 编译器以与 C 而非 C++ 兼容的方式传递参数、生成函数调用、发出重定位信息等。

没有(据我所知)在 C++ 源文件中嵌入任意 C 代码并将其视为 C 的机制。而且甚至没有将任意 C++ 代码嵌入到 C 源文件中的机制,并将其视为C++!


附录:我有点尴尬,因为我刚刚意识到到目前为止它只是部分正确。 extern "C"正如我所说,确实可以用于将外部函数(在别处定义)标记为使用 C 约定命名和调用。但它也可用于将 C++ 函数(在“此处”定义)标记为使用 C 约定命名和调用,以便可以从其他地方的 C 函数调用它。

请参阅this other answer以获得更好的解释。

总而言之,我相信有两种几乎完全不同的情况使用extern "C"

句法 功能定义 写入的函数 函数调用自 来电者写在
函数声明 别的地方 C(或者可能是 C++) 这里 C++
功能定义 这里 C++ 别的地方 C 或 C++

特别是,您可以从 C++ 调用 C 函数(第一行,我在上面讨论的情况),但您也可以从 C 调用 C++ 函数(第二行,我倾向于忘记甚至可能)。在第二种情况下,当您从 C 调用 C++ 函数时,我认为您必须确保最终编译使用的是 C++ 编译器,而不是 C 编译器,以便为需要它的 C++ 函数。

  • _我想在 C 代码中使用 C++ 特性。_ 然后将它们包装在自由函数中,声明为 `extern "C"`。

以上是extern"C"是将C代码转换为C++代码,还是仅允许编译器将C代码编译为C++代码?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>