请问程序中的extern "C" 都起到了什么作用?他是在编译时起作用还是运行时起作用? 请问程序中的extern "C" 都起到了什么作用?他是在编译时起作用还是运行时起作用?不是用它会有什么影响? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要通知编译器一个或多个函数已经在c中编译好了,想这样写出函数原型:extern "C" 函数原型 //单个函数extern "C" //多个函数{ 函数原型}这些声明通知了编译器指定的函数不在c++中编译,因此不对连接说明中列出的函数名编码。 各个厂家对c++的编译产生的代码中会把标示符翻译得一塌糊涂。extern "C"解决这个问题. “编译的时候起作用。表明是以C的标准来进行堆栈的处理”以上这句话是不是说明C和C++对处理堆栈的方式有所不同?具体说来,堆栈再C和C++程序运行的时候起到什么作用? 主要用来解决编译器对函数名称的内部命名问题。如果声明了 void func(int );在 c++中, 编译器可能把它的名字编译成 func_int 之类的形式,用以支持重载;而在c中,编译器就把它的名字编译成func;所以,如果有一个现成的C的库,里面有一个void func(int );函数,C++程序怎样使用它呢?就要用 extern "C" void func(int );来进行函数原型的声明,告诉c++编译器,别把名字改了,就叫func,以后的函数调用func(1),才能生成一个对func的调用。这样的编译模块,才能够和c库相连,而不会发生unresolved function name之类的连接错误。 这是我对 extern "C" 的理解。 和参数的入栈顺序有关么?我不清楚,希望有高手解释。c lh_lihong(黎弘)地回答让我对extern "C"有了更好的理解,非常感谢!>>>>>在 c++中, 编译器可能把它的名字编译成 func_int 之类的形式,用以支持重载;为什么将func(int)"编译成"就可以支持重载啊? 这是一句话,为了看得清除,把它放在两行来写:即“在 c++中, 编译器可能把它的名字编译成func_int 之类的形式,用以支持重载;”意思是这样的: 一个函数名字,本质上是什么呢? 应该是内存中的一个地址,这个地址指向函数的执行入口;或者说是一个函数指针。那么,程序员所看到的函数重载形式: void func(int); void func(float);编译器怎样来寻找具体的函数体呢?要注意,它们对应着两个不同的函数体,也就是不同的地址,编译器为把它们区分开,只得分别为他们起不同的名字 func_int func_float从而支持了重载。 关于对话框添加背景图片,OnEraseBkgnd,直接运行正常,开机启动才崩溃。 浮动面板如何隐藏? mfc聊天室问题 关于GetMessage! 请问各位大侠怎样停止一个服务(用函数),谢谢 MouseButton類包含在哪個頭文件中? 一个关于activex的问题,请教各位高手,在线等待!!!谢了!! 请问大家这算不算CRichEditView的一个Bug??? 在classwizard指定控件变量和用GetDlgItem()方法有什么区别? 请问:如何实现右键单击CListCtrl控件弹出菜单? 如何向List control 控件 中填数据? 大专以下的程序员或准程序员进来
{
函数原型
}这些声明通知了编译器指定的函数不在c++中编译,因此不对连接说明中列出的函数名编码。
如果声明了
void func(int );
在 c++中, 编译器可能把它的名字编译成
func_int 之类的形式,用以支持重载;
而在c中,编译器就把它的名字编译成func;所以,如果有一个现成的C的库,里面有一个void func(int );函数,C++程序
怎样使用它呢?就要用
extern "C" void func(int );
来进行函数原型的声明,告诉c++编译器,别把名字改了,就叫func,
以后的函数调用func(1),才能生成一个对func的调用。
这样的编译模块,才能够和c库相连,而不会发生unresolved function name之类的连接错误。 这是我对 extern "C" 的理解。
和参数的入栈顺序有关么?我不清楚,希望有高手解释。
c
>>>>>
在 c++中, 编译器可能把它的名字编译成
func_int 之类的形式,用以支持重载;为什么将func(int)"编译成"就可以支持重载啊?
“在 c++中, 编译器可能把它的名字编译成func_int 之类的形式,用以支持重载;”
意思是这样的:
一个函数名字,本质上是什么呢?
应该是内存中的一个地址,这个地址指向函数的执行入口;或者说是一个函数指针。
那么,程序员所看到的函数重载形式:
void func(int);
void func(float);
编译器怎样来寻找具体的函数体呢?要注意,它们对应着两个不同的函数体,也就是不同的地址,编译器为把它们区分开,只得分别为他们起不同的名字
func_int
func_float
从而支持了重载。