C文件中是否需要外部"C"?(解决奇怪的日食行为)

is extern "C" required in C files ? (to solve odd Eclipse behaviour)

本文关键字:是否 文件 外部 解决      更新时间:2023-10-16

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

有一个奇怪的地方:如果我用Eclipse查看"Thread.c"文件,它会认为有语法错误,并在几乎整个文件上加下划线,就好像代码有缺陷一样,但它绝对不是。

这是触发它的一段代码:

#ifdef __cplusplus
extern "C"
{
#endif

我知道extern"C"在c++中用于什么,但是Eclipse在。C文件中出现时存在问题。它很高兴地接受。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++通用->路径和符号-> # Symbols选项卡,并在"语言"列下选择"GNU C"(或您使用的任何C编译器)。滚动右边的符号/值列表,找到"__cplusplus"符号并删除它。确保在C编译器中只使用 。

单击OK关闭项目属性窗口,Eclipse编辑器中的语法错误警告将消失。

这段代码通常在头文件中找到,应该总是写在属于c文件的头文件中。

的原因是c在内部调用函数时使用了不同的模式(--> name mangeling)。虽然编译器可以通过扩展名区分c++代码文件和c代码文件,但它不能区分CPP文件中包含的c头文件和c++头文件。因此,它不知道是否必须修改已声明函数的名称(默认情况下是这样做的)。

则链接器尝试将使用的符号(从cpp引用函数)与创建的符号(由c文件定义)相匹配,如果没有告诉编译器不要混淆声明,则不会找到符号。

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

为了确保头文件可以在C语言中编译,我们包含了#ifdef __cplusplus, __cplusplus是由c++编译器而不是C编译器定义的。这个用法用来保护C代码不受c++ only extern "C"指令的侵害。

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

可能只是针对您的问题的一个愚蠢的变通方法。我发现,在CPP文件中使用c函数时,理论上需要extern。但是我发现在eclipse氧版本中,我们不需要指定extern c,我们可以直接在cpp文件中使用c函数和printf语句,它工作得很好。

我的解决办法可能不是很有用,但你可以试一试。
相关文章: