【问题标题】:Problem with using C code in C++ with extern "C"在带有外部“C”的 C++ 中使用 C 代码的问题
【发布时间】:2020-03-06 11:28:06
【问题描述】:

我知道当我想将 C 代码链接为 C++ 中的 C 代码时,我应该使用 extern "C"。但是使用以下代码:

/* file.h */
some (void)
{
    return 10;
}
extern "C"
{
    #include "file.h"
}
#include <iostream>

int main (void)
{
    std::cout << some() << std::endl;
}

我得到这个编译时错误:

C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数。

我该如何处理?
我在MS-Windows10 上使用MSVC2017

编辑:我知道大多数都用显式返回类型声明函数,但我应该使用USBPcap 和 USBPcap 声明一些类似的函数。我如何在我自己的 C++ 程序中使用它?

【问题讨论】:

  • 您的 C 代码不是 MSVC2017 编译器所期望的有效 C99。
  • some (void) 缺少返回类型。
  • 错误不是自己解释的吗?以正确的方式编程 - 不要保存键盘。
  • 如果该库声明了这样的函数 - 向项目提交错误以进行更正。或者更好的是——提交一个为他们解决问题的拉取请求。

标签: c++ c extern-c


【解决方案1】:

所有函数都应指定返回类型。您没有为 some 指定一个。

在旧版本的 C 中,如果您省略函数的返回类型,则默认为 int。但是 C++ 不支持。

您应该始终指定函数的返回类型:

int some(void)
{
    return 10;
}

【讨论】:

  • 是的,谢谢,我知道。但我使用了一个使用默认 int 函数类型的库,我不改变库源代码,我在我自己的 C++ 程序中使用它。
  • @GhasemRamezani 那么您应该将您的问题直接提交给项目 github 页面上的库作者。
  • @GhasemRamezani 这个代码是abandonware吗? “隐式int”函数返回类型在 C99 中从 C 中删除——实际上是 20 年前。
【解决方案2】:

extern "C" 只改变声明的链接。特别是,它禁用了某些 C++ 功能(例如重载)所需的 C++ 名称修饰。

extern "C" 不会将程序的封闭部分编译为 C。因此,声明必须仍然是格式良好的 C++。 some (void) 不是 C++ 中格式正确的声明,它解释了错误。

我该如何处理?

明确声明返回类型。

USBPcap 声明一些类似的函数。我如何在我自己的 C++ 程序中使用它?

那么你不能使用那个标题。您可以自己编写与 C++ 兼容的标头。或者,您可以使用支持隐含 int 作为扩展的 C++ 编译器。

P。 S. 自 C99 以来,隐式 int 在 C 语言中也不是格式良好的。

【讨论】:

  • extern "C"中写代码是没有意义的。如果代码在那里,则不需要extern "C"
【解决方案3】:
  1. 不要在 .h 文件中添加任何代码,静态内联函数除外
  2. 其次,正确声明函数 - 而不是懒惰的方式。 some(void) 是什么?如果 C++ 编译器知道函数的返回类型 ....
    extern "C"
    {
        int some (void)
        {
            return 10;
        }
    }
    #include <iostream>

    int main (void)
    {
        std::cout << some() << std::endl;
    }

https://godbolt.org/z/_AJgFX

【讨论】:

    【解决方案4】:

    编译器已经告诉你到底是什么问题。您尝试从 std::cout 调用的函数需要显式定义返回类型。在 C 中,编译器会自动将未定义类型函数的返回类型设置为 int,您可以编译包含非类型函数的代码,而编译器不会发出更多警告,但不要这样做,这是编写代码的极其错误的方式.在 C++ 中,就像编译器告诉你的那样,你不能,所以这是一个错误。 C和C++中的定义必须有类型,如果你想要一个不返回任何东西的函数,你需要定义它void。 但是,在 c++ 标准的最新版本中,您可以使用 auto 关键字在编译时自动检测声明的类型,因此如果您希望编译器自动检测某物的类型,请使用它,但使用它有节制地。 所以,最后,如果你想编写 C 或 C++ 代码,请在你的定义中添加一个类型,这不是 python 或 javascript...

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多