4

我知道当我想将 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++ 不支持默认整数。

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

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

4

4 回答 4

5

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

在旧版本的 C 中,如果您省略函数的返回类型,则默认为int. 然而,C++ 不支持这一点。

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

int some(void)
{
    return 10;
}
于 2019-11-10T15:36:53.033 回答
4

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

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

我该如何处理?

显式声明返回类型。

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

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

PS 隐式 int 自 C99 以来在 C 语言中也不是格式正确的。

于 2019-11-10T16:00:29.433 回答
2
  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

于 2019-11-10T15:38:29.393 回答
0

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

于 2019-11-10T20:03:36.780 回答