extern C和struct方法

时间:2011-08-03 20:05:21

标签: c++ c struct extern

给出以下C ++代码,

#ifdef __cplusplus
extern "C" {
#endif
        struct foo {
                void getNum() { 
                }
        };
#ifdef __cplusplus
}
#endif

int main (int argc, char * const argv[]) {
        return 0 ;
}

是否可以从C调用getNum()

4 个答案:

答案 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