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

9 浏览
0 Comments

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

这个问题已经有了答案

extern \"C\"在C++中有什么作用?

我有个小问题.

我曾经认为使用extern \"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 
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

然后我遇到了关于数据类型、名字空间和各种C++关键字的500个错误,这些在C中是不存在的.

问题:

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

有没有一种方法可以使C代码调用C++代码或将C代码转换成100%的C++代码,而不需要将文件的扩展名从.c改为.cpp

我的目标是通过在.c文件的头部使用extern \"C\"来从C中使用C++特性,但我却不得不说它对我不起作用。

编辑:

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

#include 
#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 
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 
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
}

admin 更改状态以发布 2023年5月21日
0
0 Comments

在C++代码中,您可以使用extern \"C\" { ... } 来声明一些外部函数,这些函数是C函数而不是C++函数。\n\nextern \"C\" { ... } 并不会将C代码转换为C++代码,也不会将C++代码转换为C代码。\n\n当您需要调用一些源文件以.c 结尾的C文件中声明的其他函数时,就需要使用extern \"C\" { ... },这些C文件已经被编译为C而不是C++。extern \"C\" { ... } 确保您的C++编译器以与C兼容的方式传递参数,生成函数调用,发出重定位信息等。\n\n我不知道是否有一种机制来嵌入任意的C代码到C++源文件中,并将其作为C代码处理。同样,也没有一种机制可以将任意的C++代码嵌入到C源文件中,并将其视为C++代码。\n\n补充说明:我有些尴尬,因为这个答案被投票并被接受,但我突然意识到它迄今为止只是部分正确的。extern \"C\"确实可以用来标记其它地方定义的外部函数是使用C条件命名和调用的,就像我说的那样。但它也可以用于标记在此处定义的C++函数是使用C条件命名和调用的,以便可以从其它地方的C函数中调用它。\n\n请参见另一个答案,以获得更好的解释。\n\n总之,我认为使用extern \"C\"有两种几乎完全不同的情况:\n\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

syntax function defined function written in function called from caller written in
function declaration 其他地方 C(或可能是C++) 此处 C++
function definition 此处 C++ 其他地方 C或C++

\n\n特别是,您可以从C++调用C函数(第一行,我上面所说的情况),但也可以从C中调用C++函数(第二行,我往往忘记它是可能的)。在第二种情况下,当您从C中调用C++函数时,我认为您必须确保最后的编译使用C++编译器,而不是C编译器,以便为需要运行时支持的C++函数提供正确的支持。

0