extern “C”和extern “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.c
    
    extern “C” int QQ(int e);//这里就不是调用头文件了
    
    int main(int argc, char **argv)
    
    {
    
    int square = QQ(5);
    
    printf(“%d\n”, square);
    
    return 0;
    
    }
    
    基本上就是这样的了。以后希望再多多学习。即使不知道具体在工作后能用到不。但是我还在想为什么调用方式是这样的区别了??是不是跟编译方式不同,导致连接方式不同。所以才会导致调用方式不同呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值