在带有 extern "C" 的 C++ 中使用 C 代码的问题

Problem with using C code in C++ with extern "C"

我知道什么时候我想 link 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: missing type specifier - int assumed. Note: C++ does not support defualt-int.

我该如何处理?
我在 MS-Windows10.

上使用 MSVC2017

编辑:我知道大多数函数都用显式 return 类型声明函数,但我要使用什么 USBPcap 和 USBPcap 声明一些函数,例如那。我如何在自己的 C++ 程序中使用它?

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

指定一个

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

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

int some(void)
{
    return 10;
}
  1. 除静态内联函数外,不要将任何代码放入 .h 文件
  2. 其次正确声明函数——而不是懒惰的方式。什么是 some(void)?如果 C++ 编译器知道函数的 return 类型....
    extern "C"
    {
        int some (void)
        {
            return 10;
        }
    }
    #include <iostream>

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

https://godbolt.org/z/_AJgFX

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

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

How i can deal with this ?

显式声明 return 类型。

USBPcap declare some function like that. How i can use it in my own C++ program ?

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

P. S. 自 C99 以来,C 语言中的隐式 int 也不是 well-formed。

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