分享

浅谈extern "C++"/extern "C "

 WUCANADA 2012-04-24
浅谈extern "C"/extern "C++ " (2011-05-27 15:47)
分类: C/C++笔记


 以前基本没接触过extern "C"或者extern "C++  "这样的用法。可能企业中会用到,就来小记下,以后不会了在回头来看下。实在不行就百度啦! 

 从 字面意思来看,extern就是申明她修饰的函数或者全局变量(记住是全局变量哦)可以被本模块或者其它模块所调用。"C"/"C "就是连接规范的规定,表明采用的是C还是C 连接规范。比如模块B想调用模块A的全局变量,只需要在A中申明全局变量为extern 就可以了,那么虽然在编译时找不到,但是B在连接时就可以找从A编译好的模块中找到了。但是从来没用过。唉!
 与此对应的是static,被她申明的只能在本模块中使用。
 
 remember: extern int a;这样申明的话表明了其实并没有为a分配内存空间,而且在所有的模块中只能被定义为一次。还是没用过。唉!
 先说下加了extern "C"和不加在C 中的连接方式的不同吧:
 //模块A moduleA.h
 #ifndef MODULE_A_H
 #define MODULE_A_H
 void Print(ElemType e);
 #endif
 //模块A的实现 moduleB.cpp
 #include "moduleA.h"
 Print(ElemType e);
 当模块B调用模块A的函数时,她会从A模块生成的moduleA.obj中去寻找_moduleA_ElemType_或者类似这种类型的符号。
 再说加了extern "C":
 #ifndef MODULE_A_H
 #define MODULE_A_H
 extern "C" void Print(ElemType e);
 #endif
 那么当B在同样的调用时:
 1.A模块生成的编译目标并没有生成类似_moduleA_ElemType_这种符号;
 2.B寻找的是未经过处理的_Print.
总体来说,当面试官问你extern "C"的作用时,你就说她就是实现了C和C++的混合编成。我曾看过百度的几道面试题,其中就有一个这个,还有一些设计模式的题目。没事多看看啊。

具体举例来讲:
 C++中调用C函数----->>>
 /***C头文件test.h****/
 #ifndef TEST_H
 #define TEST_H
 extern "C" int QQ(int e);
 #endif
 /***C 实现文件 test.c**/
 #include "test.h"
 int QQ(int e)
 {
    return e*e;
 }
 //C++文件实现 cppTest.cpp
 #include<iostream.h>
 extern "C"
 {
   #include "test.h"
 }
 int main(int argc, char **argv)
 {
   int square = QQ(5);
   cout<<square<<endl;
   return 0;
 }
C中调用C++函数----->>>
 /***C++头文件 cppSquare.h***/
 #ifndef CPP_SQUARE_H
 #define CPP_SQUARE_H
 extern "C" int QQ(int e);
 #endif
 /***C++实现**** cppSquare.cpp/
 #include "cppSquare.h"
 int QQ(int e)
 {
    return e*e;
 }
 //C文件调用实现 cTest.cpp
 extern "C" int QQ(int e);//这里就不是调用头文件了
 int main(int argc, char **argv)
 {
   int square = QQ(5);
   cout<<square<<endl;
   return 0;
 }
基本上就是这样的了。以后希望再多多学习。即使不知道具体在工作后能用到不。但是我还在想为什么调用方式是这样的区别了??是不是跟编译方式不同,导致连接方式不同。所以才会导致调用方式不同呢?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多