CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

为什么用*.c不行,必须要用*.cpp?

楼主matrixql(实现梦想)2003-06-02 16:51:07 在 C/C++ / C语言 提问

我把原先用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

相关问题

  • 为什么在linux下不能用C
  • 为什么我的Turbo C不能用???
  • C# web 中 为什么不能用System.Windows.Forms.Clipboard.SetDataObject("");
  • 为什么UNIX编程大都用C而不用C++???
  • 为什么UNIX编程大都用C而不用C++???
  • 为什么一般欠入式用C?而不用C++
  • .c and .cpp
  • CopyFile ("C:\1\1.txt" , "C:\1.txt",0);这句为什么不起作用?
  • 为什么用C的strcmp会比C++的compare快这么多????
  • C#的类好像不用加“C”做前缀,为什么呢?

关键词

  • c++
  • 函数
  • 编译器
  • 文件
  • 编译
  • cpp
  • 代码
  • 文件名
  • 连接
  • extern

得分解答快速导航

  • 帖主:matrixql
  • nkscorpion
  • pzytony
  • treamboy
  • flyfreely
  • bourbaki
  • atma
  • treamboy
  • lw549

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo