回 帖 发 新 帖 刷新版面

主题:extern "C"的用法

多播库头文件如下
#ifndef _MCASTLIB_H_
#define _MCASTLIB_H_

#include <WinSock2.h>
#include <WS2tcpip.h>

[color=0000FF][color=FF0000]#ifdef __cplusplus
extern "C"{
#endif[/color][/color]
int mc_join( .......)
int mc_setIF(.......)
 .
 .
 .
 .
 .
[color=FF0000]#ifdef __cplusplus
}
#endif[/color]
#endif

请问上面红色部分是什么意思??

回复列表 (共9个回复)

沙发

是用于C和C++混合编程的,这里有比较详尽的解释。
http://hi.baidu.com/zxchao/blog/item/da95ada1c88eda8846106453.html

板凳

jiushi 指定函数使用C方式链接

3 楼

收获不少,感谢一楼。

4 楼

还是不知所云

5 楼

随便举个例子。
C中的函数void fun(int param)在编译后的目标代码中,名字为_fun。
而C++中的函数void fun(int param)在编译后的目标代码中,名字为_void_fun_int。

这样子,我用C的编译器编译了一个源文件,产生了t.obj目标文件,里面含有函数void fun(int param),而在目标文件中也就是_fun了。
现在我想在我的C++程序中调用这个函数void fun(int param)的话,C++编译器默认是要调用目标文件中的_void_fun_int。不过目标文件t.obj中实际的是_fun而不是_void_fun_int(因为函数void fun(int param)是用C的编译器编辑的而不是用的C++的编译器),所以我就要用extern "C" void fun(int param)声明这个函数,那么C++程序在调用的时候就不用默认的_fun而是_void_fun_int了。

呵呵,希望你能知我所云~

6 楼

现在我想在我的C++程序中调用这个函数void fun(int param)的话,C++编译器默认是要调用目标文件中的_void_fun_int。不过目标文件t.obj中实际的是_fun而不是_void_fun_int(因为函数void fun(int param)是用C的编译器编辑的而不是用的C++的编译器),[color=FF0000]所以我就要用extern "C" void fun(int param)声明这个函数,那么C++程序在调用的时候就不用默认的_fun而是_void_fun_int了。[/color]
红色部分不太理解

"用extern "C" void fun(int param)声明这个函数"是在C里面声明还是在C++里面申明啊    用了extern "C" void fun(int param)之后 目标文件是_void_fun_int了吗??  用了extern "C" void fun(int param)之后C++程序在调用的时候是调用_fun还是_void_fun_int?


7 楼

不好意思,那一句写错了,是“所以我就要用extern "C" void fun(int param)声明这个函数,那么C++程序在调用的时候就不用默认的_void_fun_int而是_fun了”。现在应该明白了吧?

——是在C++源文件中声明。

8 楼

我还是想问个问题  

书上多播库头文件如下
#ifndef _MCASTLIB_H_
#define _MCASTLIB_H_

#include <WinSock2.h>
#include <WS2tcpip.h>

#ifdef __cplusplus
extern "C"{
#endif
int mc_join( .......)
int mc_setIF(.......)
 .
 .
 .
 .
 .
#ifdef __cplusplus
}
#endif
#endif


还有个实现文件  

这些文件是不是由内核提供的啊??

我调用之前还要不要先编写这些函数??

你说用C++调用C编写的函数要用extern  可是这个头文件和实现文件都是用C++编写的啊  

我很困惑  求求你再帮帮我



9 楼

对那个多播库头文件我不懂,不好说什么,不过这些文件显然不是由你来编写,所以大可以安心。
如果你能给我那个头文件的路径的话我可以研究研究的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册