extern "C"是将C代码转换为C++代码,还是允许编译器将C代码编译为C++代码?
extern "C"是将C代码转换为C++代码,还是允许编译器将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 }
在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
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++函数提供正确的支持。