为什么用*.c不行,必须要用*.cpp?
我把原先用C写的程序文件加入到vc的工程后,文件名的后缀如果用.c就会产生如下问题
DVD ExView.obj : error LNK2001: unresolved external symbol "int __cdecl scrn_iDrawTaskStart(int)" (?scrn_iDrawTaskStart@@YAHH@Z)
_scrn_drw.obj : error LNK2001: unresolved external symbol _wucExecTask
文件名的后缀如果用.cpp就没有问题了。
那么为什么用c文件,就找不到函数的定义呢?
问题点数:50、回复次数:11Top
1 楼nkscorpion(蝎子)回复于 2003-06-02 16:54:48 得分 3
c文件有c文件的编译连接参数,
cpp文件有cpp文件的编译连接参数。
如果修改相应的头文件,
是可以避免这个问题的。
but, why not just use cpp?Top
2 楼pzytony(507)回复于 2003-06-02 16:56:34 得分 1
把文件名改成cpp就可以了
c++就是这么规定的
Top
3 楼matrixql(实现梦想)回复于 2003-06-02 17:18:36 得分 0
只是想用VC中的显示控制部分来做一个原型,
将来项目中还是得用c文件,
所以如果可以的话,想再开始的时候就尽量不用cpp。Top
4 楼treamboy(亲月)回复于 2003-06-02 17:24:42 得分 1
c++中执行主体都是.cpp文件后缀,一般情况下其编译器不提供对.c文件的连接.若要使用.c文件就要将其写成dll,通过导入接口来使用.Top
5 楼flyfreely(林雨亭)回复于 2003-06-02 17:43:22 得分 1
用extern "c"的声明不行吗?Top
6 楼bourbaki(若昔难得)回复于 2003-06-03 09:15:10 得分 30
C和C++各自的编译器的naming conventions 是不一样的。比如一个函数
int func();
C编译器在compile时可能会给这个函数加上一个'_'作为decoration,即_func,也可能不加;而C++编译器则由于函数重载的问题会将参数类型等信息体现在decoration中。
因此如果你要在C++中使用C中的函数,也就是说为C编译器所定义的函数,你必须用
extern "C" { declaration }
来声明该函数;或者相反你想在C或者Fortran中使用C++的函数,也必须这么声明。
下面这张表列出了extern "C"对于链接的影响
Specification | Effect
===============================================================================
On an object | Affects linkage of that object only
-------------------------------------------------------------------------------
On a | Affects linkage of that function and all functions or objects function | declared within it
-------------------------------------------------------------------------------
On a | Affects linkage of all nonmember functions and objects declared class | within the class
-------------------------------------------------------------------------------
(摘自MSDN)
下面是一些注意事项:
1。当然,extern "C"只能用于C++;
2。如果一个函数被声明两次,比如
int func();
……
extern "C" int func();
或者
extern "C" int func();
……
int func();
以第一次为准;
3。不能用extern "C"去声明一个成员函数;
4。对于被重载的函数,只能如此声明其中一个实例;
5。对于MS的标准的C头文件中的函数,你不必操心,你看了下面这个例子就知道了
// ********Sample.h************
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
// *********end sample.h***************Top
7 楼yuanjian79(yuanjian1979)回复于 2003-06-03 09:29:51 得分 0
拷贝。Top
8 楼atma(当时明月在)回复于 2003-06-03 09:58:03 得分 10
在VC中,.c的文件是采用C 编译器来编译的,.cpp文件采用C++编译器来编译。而C++编译器在编译的时候,会采用名字重组的技术为函数重新命名,而C语言没有。所以如果你的工程中有C的代码,也有C++的代码,那么你需要通知编译器在调用C语言的代码的时候,该代码没有被名字重组过。一般使用连接说明extern "C",告诉C++编译器,这里使用的C代码。Top
9 楼treamboy(亲月)回复于 2003-06-03 10:56:40 得分 2
extern "c"是相對函數來說的Top
10 楼lw549(那个孩子他爹)回复于 2003-06-03 10:57:12 得分 2
一定是你用的c++的特性了。Top
11 楼matrixql(实现梦想)回复于 2003-06-03 13:26:46 得分 0
回复人:ruihuahan(飞不起来的笨鸟) () 信誉:100 2003-6-2 17:11:25
在原来用c语言编写的.h文件中把所有的函数声明用extern "C "括起来。
问题出在:编译器把.c文件的函数编译成了C风格的函数。而在调用的地方却按C++风格来调用(因为没有用extern "C "说明)。所以连结程序会找不到相应的文件。
Top




