给出以下C ++代码,
#ifdef __cplusplus
extern "C" {
#endif
struct foo {
void getNum() {
}
};
#ifdef __cplusplus
}
#endif
int main (int argc, char * const argv[]) {
return 0 ;
}
是否可以从C调用getNum()
?
答案 0 :(得分:7)
不,因为getNum
是一个成员函数,C没有。
该问题的一个可能的解决方案是编写一个C ++函数,将foo
实例作为foo*
(其中foo
更改为空结构)返回到C(I假设这是二进制编译为C链接到的C ++),然后在C ++中有一个名为foo_getNum
的自由函数或者其他东西,它取一个foo*
(其定义被修改为C版本为空)在其上调用getNum
。显然,它不是类型安全的(但是,即使foo*
为空,也要foo
优于void*
- 感谢大卫)。
答案 1 :(得分:7)
extern "C"
对成员函数没有影响:getNum()
具有C ++语言链接。
C ++语言标准规定(C ++03§7.5/ 4):
对于类成员和成员函数的名称,将忽略C语言链接 类成员函数的类型。
所以,不,你不能直接从C程序调用这个函数(但是,正如其他人所说,你无法将该代码编译为C,因为C没有成员函数)。当然可以想象,某些实现可能允许您通过一些特定于实现的方法从C程序调用此函数。
答案 2 :(得分:3)
您无法以便携方式从C调用该成员函数。您需要通过展平它来公开您的C ++接口。
答案 3 :(得分:1)
您提供的代码不会在C模式下编译,因为C编译器不支持struct中的函数。但是,您可以在C ++中创建一个函数,它可以调用它并将其与C链接链接。 创建2个文件main.c和abc.cpp
main.c代码
extern "C" void getNumCaller();
int main ()
{
getNumCaller();
return 0;
}
abc.cpp的代码
#include <iostream>
struct foo {
void getNum() {
std::cout << "calling getNum" << std::endl;
}
};
extern "C" void getNumCaller()
{
struct foo abc;
abc.getNum();
}
编译代码:
g++ -o abc abc.cpp main.c
你会得到输出:
calling getNum