以前基本没接触过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) |