• extern关键字及CC++相互调用


    extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用。

    1.extern修饰变量

    (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问时,需要用extern声明该变量才可以。

    注意extern的严格声明,如在一个文件中声明char a[] =  "abcd";另一个文件如果访问需声明extern char a[],而不能是extern char *a;

    (2)如果在*.h中声明,其他文件使用时,则只需要包含头文件即可,无需再声明,建议只在头文件中声明就好了。

    注意:extern可以声明无数次,但只能定义一次,否则会出现链接错误。另外能够被其他模块以extern修饰符引用到的变量通常是全局变量,extern int m可以放在b.c中的任何地方,如果放在代码块内,则b.c中访问m的区域就只能限于代码块内。

    (3)如果一个变量声明于代码块内部,在它前面添加extern表示引用的是全局变量而不是局部变量。

    2.extern修饰函数(不用"C"修饰)

    extern修饰函数和变量没有区别,只需extern声明后,即可用于该文件中各个位置。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件,在程序中取代include “*.h”来声明函数。

    一般调用方式如下:首先在头文件extern 修饰声明函数,包含该头文件在对应的c文件中实现该函数,C语言中其他文件使用时可以直接调用,也可用extern声明该函数后使用,但C++必须声明后才能使用。建议声明后使用。

    使用extern和包含头文件来引用函数有什么区别呢?

    extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

    3.extern用于CC++相互调用

    extern修饰函数时可以添加"C",从而实现CC++相互调用。

    (1)C调用C++

     C++头文件中函数前用extern "C"修饰声明,在对应的cpp文件中实现该函数时需注意函数接口不能使用vector或string等C++专有特性,否则C中无法使用

    一般调用方式如下:首先在C++头文件extern "C"修饰声明函数,包含该头文件在对应的cpp文件中实现该函数,使用时可以和普通extern声明函数一样使用,在C语言中,只能指定为extern类型,C语言中不支持extern"C"声明

    (2)C++调用C

    C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要生成用于链接的中间函数名。

    一般调用格式有两种,第一种在c语言头文件中用extern"C"声明

    exte.h

    1 #ifdef __cplusplus
    2 extern "C" {
    3 #endif
    4 
    5     void mytest();
    6 
    7 #ifdef __cplusplus
    8 }
    9 #endif

    exte.c

    1 #include "exte.h"
    2 #include <stdio.h>
    3 void mytest(){
    4 
    5     printf("%s", "mytest"); 
    6 }

    main.cpp

    1 #include<iostream>
    2 //#include "exte.h"
    3 extern "C" void mytest();//和上面的语句二选一即可,如果函数太多,一般用上面包含头文件的方法
    4 int main(){
    5 
    6     mytest();
    7     system("pause");
    8     return 0;
    9 }

    第二种是在cpp文件调用时,通过extern"C"包含C语言头文件

    exte.h

     1 void mytest(); 

    exte.c

    1 void mytest(){
    2 
    3     printf("%s", "mytest"); 
    4 }

    main.cpp

     1 #include<iostream>
     2 
     3 extern "C"{     //和下面的语句二选一即可
     4     #include "exte.h"
     5 }
     6 
     7 //extern "C" void mytest();
     8 
     9 int main(){
    10 
    11     mytest();
    12     system("pause");
    13     return 0;
    14 }

    其中第二种,可以去掉include头文件,调用时extern "C" void mytest();即可。

    综上,可以在头文件中声明,也可以调用时声明。至于是否需要头文件,根据实际需要决定。

  • 相关阅读:
    深度学习一些专有名词
    面对imbalance data的时候
    关于各个loss的理解--持续更新
    关于gan的流程理解
    IIS8.0 配置应用程序初始化功能
    IIS7.5 配置应用程序初始化功能
    模拟差的网络环境
    安装Android Studio
    java.lang.NoClassDefFoundError: HttpServletRequest
    Fiddler 断点调试http请求
  • 原文地址:https://www.cnblogs.com/qinguoyi/p/10100777.html
Copyright © 2020-2023  润新知