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

问题描述 投票:0回答:5

我对使用 gcc 和 g++ 工具的混合 C/C++ 应用程序相对较新。 为了掌握它,我下载了 iperf 源代码并使用 Eclipse 成功构建了它。

有一个奇怪的地方:如果我使用 Eclipse 查看文件“Thread.c”,它认为存在语法错误,并在几乎整个文件下划线,就好像代码有缺陷一样,但事实并非如此。

这是触发它的代码:

#ifdef __cplusplus
extern "C"
{
#endif

我知道 extern "C" 在 C++ 中的用途,但是当它出现在 .c 文件中时,Eclipse 会出现问题。不过它很乐意接受 .cpp 和 .h 文件中的它。

我已经检查了 Make 实用程序如何构建 iperf 应用程序,我发现它总是使用 gcc 来编译 c 文件,使用 g++ 来编译 cpp 文件,这让我想知道是否确实需要 extern "C"。它绝对不会造成伤害,因为 gcc 编译器很乐意处理它,但如果不是严格要求,我可以忽略它并在 Eclipse 中获得更好的可读性。

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

c++ c eclipse gcc g++
5个回答
5
投票

如果您使用 Eclipse,您在编辑器中看到的内容与 Eclipse 内部索引器/解析器有关。您的混合 C/C++ 项目可能会毫无问题地编译和构建,但是当您打开一个具有

的源文件时
#ifdef __cplusplus
extern "C" {
#endif

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

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

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


0
投票

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

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

然后链接器尝试将使用的符号(对 cpp 中函数的引用)与创建的符号(由 c 文件定义)进行匹配,如果没有告诉编译器不要破坏声明,则链接器找不到该符号。


0
投票

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

为了确保头文件在 C 中编译,我们包含

#ifdef __cplusplus
__cplusplus
是由 C++ 编译器而不是 C 编译器定义的。此用途用于保护 C 代码免受仅 C++
extern "C"
指令的影响。

IDE 不使用编译器来实现代码智能,因此可能会出错。


0
投票

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

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


0
投票

由于这是这个问题在google中的第一个搜索结果,所以我也将我的解决方案放在这里。 如果您已将 C 源文件和头文件的 Laguage 映射配置为 (GNU) C,则在项目中显示语法错误,只需覆盖工作区范围的设置,以便 C 文件也使用 (GNU) C++ 映射。

© www.soinside.com 2019 - 2024. All rights reserved.