是C文件中需要extern“C”? (解决奇怪的Eclipse行为)

我对使用gcc和g ++工具的Mixed C / C ++应用程序比较陌生。 为了掌握它,我已经下载了iperf源代码并使用Eclipse成功构建了它。

有一个奇怪之处:如果我使用Eclipse查看文件“Thread.c”,它认为存在语法错误并且几乎整个文件都加下划线,好像代码有缺陷,这绝对不是。

这是触发它的代码片段:

#ifdef __cplusplus extern "C" { #endif 

我知道在C ++中使用extern“C”,但是当存在于.c文件中时Eclipse出现问题。 它很高兴地在.cpp和.h文件中接受它。

我已经检查了Make实用程序如何构建iperf应用程序,我看到它总是使用gcc来编译c文件和g ++来编译cpp文件,这让我想知道是否真的需要extern“C”。 它肯定没有受到伤害,因为gcc编译器很乐意处理它,但如果不是严格要求我可以省略它并在Eclipse中获得更好的可读性。

我还看了一个Eclipse的行为的可能解决方案,但还没有找到一个,如果有人能指出如何解决它同样好。

如果您使用的是Eclipse,那么您在编辑器中看到的内容与Eclipse内部索引器/解析器有关。 您的混合C / C ++项目可以编译和构建没有问题,但是当您打开一个具有的源文件时

 #ifdef __cplusplus extern "C" { #endif 

您可能会在外部“C”行上看到标记的语法错误。 这意味着在项目设置中为C编译器定义了“__cplusplus”符号。

为了摆脱Eclipse编辑器中的语法错误,请转到项目属性 – > C / C ++常规 – >路径和符号 – >#符号选项卡,然后选择“GNU C”(或您使用的任何C编译器) “语言”专栏。 滚动右侧的符号/值列表,找到“__cplusplus”符号并将其删除。 确保为C编译器执行此操作。

单击“确定”关闭项目“属性”窗口,语法错误警告将在Eclipse编辑器中消失。

这段代码通常在头文件中找到,并且应该始终写入属于c文件的头文件。 (标题末尾有相应的右括号)

原因是,c使用不同的方案如何在内部调用函数( – >名称管理)。 虽然编译器可以通过其扩展名区分c ++代码文件和c代码文件,但它无法区分c-header和cpp文件中包含的c ++头文件。 所以它不知道是否必须破坏声明的函数的名称(默认情况下)。

然后链接器尝试将使用的符号(从cpp引用函数)与创建的符号(由c文件定义)匹配,如果编译器没有被告知不破坏声明,则它不会找到符号。

extern "C"在C ++中是合法的,并确保指定的函数具有C链接。 这意味着函数参数不会被破坏成二进制函数名。

为确保头文件在C中编译,我们包含#ifdef __cplusplus __cplusplus由C ++编译器而不是C编译器定义。 这种用法用于保护C代码不受C ++ extern "C"指令的影响。

IDE不会使用编译器进行代码智能,因此可能会出错。

对你的问题可能只是一个愚蠢的解决方法。 我发现,在cpp文件中使用c函数时,理论上需要extern。 但我发现在eclipse氧版本中,我们不必指定extern c,我们也可以在cpp文件中直接使用c函数和printf语句,它只是工作正常。 没有尝试过旧版本的eclipse。

我的解决方案可能不是很有帮助,但您可以尝试一下。 它对我有用。