我正在回答这个问题,试图涵盖更详细的答案中可能涵盖的内容,以帮助提问者或其他访问此页面的人。
错误:“字符串常量前应为 '('”</p>
正如您问题的其他答案中提到的,extern "C"
不是有效的 C(它仅在 C++ 中有效)。如果您仅使用纯 C,则可以将其删除。
但是,如果您(或其他人)混合了 C 和 C++ 源文件,那么您可以使用宏__cplusplus
。__cplusplus
将为通过 C++ 编译器运行的任何编译单元定义宏。通常,这意味着 .cpp 文件和该 .cpp 文件包含的任何文件。
因此,如果不同的编译单元包含相同的 .h(或 .hh 或 .hpp 或 what-have-you),则可以在不同时间将它们解释为 C 或 C++。如果您希望 .h 文件中的原型引用 C 符号名称,那么它们在被解释为 C++ 时必须具有 extern "C" ,并且在被解释为 C 时它们不应具有 extern "C" (如您的情况你得到一个错误!)。
#ifdef __cplusplus
extern "C" {
#endif
// Your prototype or Definition
#ifdef __cplusplus
}
#endif
注意:extern "C"
所做的只是影响链接。C++ 函数,在编译时,它们的名字被弄乱了。这就是使重载成为可能的原因。函数名称会根据参数的类型和数量进行修改,因此具有相同名称的两个函数将具有不同的符号名称。
如果您包含具有 C 链接的代码的标头(例如由 C 编译器编译的代码),那么您必须extern "C"
包含标头 - 这样您就可以与库链接。( Otherwise, your linker would be looking for functions with names like _Z1hic when you were looking for void h(int, char)
)。