c和C++与库的链接

问题描述:

假设我有一个使用类和模板的C++库lib.h。再假设我有以下的自定义C++头myLink.h:c和C++与库的链接

#include "lib.h" 

    //call methods from lib.h that use templates and classes 
    // and return an integer based off of the information gained from calling functions lib.h 
    extern "C" int foo(int param1, const int param2); 

现在假设我在一个名为C test.c.如下调用函数foo()是否合法?

//in test.c 
int first = foo(5, 6); 

此外,编译的目标代码/链接器阶段发生了什么?

谢谢!

+2

您可能希望让您的“myLink.h”能够从C和C++编译,例如通过使用'#ifdef __cplusplus'在单独的行上包装'extern“C”{'和'}'。这样'int foo(int param1,const int param2);'部分对于纯C代码是可见的,其余部分对C++是可见的。如果没有这个,你的“test.c”将需要一个单独的方法来声明函数。 – 2012-07-10 03:19:29

按如下方式调用函数foo()是否合法?

int first = foo(5, 6); 

是的,这是合法的。尽管您应该阅读以下内容,以确保此法律通话将链接。

汇编的对象代码/链接器阶段发生了什么?

类的使用不会干涉。 C++类将被编译为链接器将理解的对象代码。从多德的评论

编辑:

你的模板也将凭借foo称他们创建的。

+0

不是真的 - 如果'foo'使用任何模板,当您编译定义'foo'的C++源文件时,它们将被实例化。 – 2012-07-10 03:19:49

+0

@ChrisDodd:你是对的!谢谢。 – 2012-07-10 03:27:31

+0

您可能需要链接一个支持C++的链接器。 C++端可能具有访问静态对象,使用异常处理或任何需要特定于C++的初始化代码的其他任何东西的代码。 – sfstewman 2012-07-10 04:01:04