答案: 这里讲的是调用编译的区别.大家看WIN32 SDK的头文件,总是可以看到
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
这个就是直接能够体现实际编程时区别的地方. 在WIN系列下.所有的WIN32 SDK提供的LIB都是以C的形式存在的.当然,C和C++同样都支持C,STDCALL,FASTCALL调用.为什么系统提供C编译器编译的LIB而不是C++编译的LIB呢?这里其实就是C和C++编译器不同的地方.
所有的函数名称只有在汇编编译器下才最清楚.因为经汇编编译器编译的函数不经过任何修饰.
C的编译器编译出来的函数名称如果在汇编编译器看来一个C调用将在函数名前家下划线('_').而一个STDCALL的函数将是_FUNC@NUMBER 的形式.如FUNC(void)经过编译器后成为_FUNC@0.一个FASTCALL调用的函数被编译成@FUNC@0.顺便提一下.在WIN32的编译器里不再需要PASCALL调用.VC6已经取消了对PASCALL的支持.
光看C的编译还不够,看一下C++编译器是怎么干的.在缺省情况下.一个C++的函数经过C++编译器后编译出的函数名包括函数名,所属的类,参数类型, 调用约定,返回类型.而且更要命的是这么多的信息,只有函数名和类名在编译后还依稀可见.其他就是一长串的ABCD字母,根本就是无法辨认其意义的.我们在VC手册里可以看到
一个例子:
void __stdcall b::c(float){}; -----------> ?c@b@@QAGXM@Z
一个函数被编译得连名字也不知道怎么样了.这么一来.如果SDK提供的是C++编译器提供了LIB.那么可以说就无法编译任何一个完整的WIN程序.更加不用说什么混合语言编程.
现在,VC编译器提供了个extern语句.当出现extern 'C'{}语句,括号里的函数将以C方式经过编译器.从而使提供库程序方便那么点.
其实两种语言都是很相近的
最简单的解释。你学了C语言和VB再学C++有可能都学不会
上一个:请问C语言中int型数组能不能用str做数组名?
下一个:C语言中所有的代码及其代表的意思,有谁知道?