在带有 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;
}
- 除静态内联函数外,不要将任何代码放入 .h 文件
- 其次正确声明函数——而不是懒惰的方式。什么是
some(void)
?如果 C++ 编译器知道函数的 return 类型....
extern "C"
{
int some (void)
{
return 10;
}
}
#include <iostream>
int main (void)
{
std::cout << some() << std::endl;
}
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...
我知道什么时候我想 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;
}
- 除静态内联函数外,不要将任何代码放入 .h 文件
- 其次正确声明函数——而不是懒惰的方式。什么是
some(void)
?如果 C++ 编译器知道函数的 return 类型....
extern "C"
{
int some (void)
{
return 10;
}
}
#include <iostream>
int main (void)
{
std::cout << some() << std::endl;
}
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...