主题:extern "C"的用法
我要飞飞飞
[专家分:180] 发布于 2008-05-16 02:35:00
多播库头文件如下
#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个回复)
沙发
龙·之骄 [专家分:330] 发布于 2008-05-16 12:07:00
是用于C和C++混合编程的,这里有比较详尽的解释。
http://hi.baidu.com/zxchao/blog/item/da95ada1c88eda8846106453.html
板凳
vfdff [专家分:740] 发布于 2008-05-17 20:05:00
jiushi 指定函数使用C方式链接
3 楼
mathbox [专家分:0] 发布于 2008-05-18 15:41:00
收获不少,感谢一楼。
4 楼
我要飞飞飞 [专家分:180] 发布于 2008-05-18 17:28:00
还是不知所云
5 楼
龙·之骄 [专家分:330] 发布于 2008-05-18 18:29:00
随便举个例子。
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 楼
我要飞飞飞 [专家分:180] 发布于 2008-05-19 13:49:00
现在我想在我的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 楼
龙·之骄 [专家分:330] 发布于 2008-05-19 18:54:00
不好意思,那一句写错了,是“所以我就要用extern "C" void fun(int param)声明这个函数,那么C++程序在调用的时候就不用默认的_void_fun_int而是_fun了”。现在应该明白了吧?
——是在C++源文件中声明。
8 楼
我要飞飞飞 [专家分:180] 发布于 2008-05-20 01:12:00
我还是想问个问题
书上多播库头文件如下
#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 楼
龙·之骄 [专家分:330] 发布于 2008-05-20 22:15:00
对那个多播库头文件我不懂,不好说什么,不过这些文件显然不是由你来编写,所以大可以安心。
如果你能给我那个头文件的路径的话我可以研究研究的。
我来回复