Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2630889
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2011-05-27 15:47:02

 以前基本没接触过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
 extern "C"
 {
   #include "test.h"
 }
 int main(int argc, char **argv)
 {
   int square = QQ(5);
   cout<
   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.c
 extern "C" int QQ(int e);//这里就不是调用头文件了
 int main(int argc, char **argv)
 {
   int square = QQ(5);
   printf("%d\n", square);
   return 0;
 }
基本上就是这样的了。以后希望再多多学习。即使不知道具体在工作后能用到不。但是我还在想为什么调用方式是这样的区别了??是不是跟编译方式不同,导致连接方式不同。所以才会导致调用方式不同呢?
阅读(2008) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~