zoukankan      html  css  js  c++  java
  • C++ extern C

     1 /****test.cpp****/
     2 
     3 #include<iostream>
     4 using namespace std;
     5 extern "C"  //利用C编译器的符号规则生成_value
     6 {
     7     int value();
     8 }
     9 int main(){
    10     cout<<value()<<endl;
    11 }
    12 
    13 /*
    14     extern 是C/C++语言中表明函数和全局变量作用范围(可见性)
    15     的关键字,该关键字告诉编译器,其声明的函数和变量可以在"全局"范围使用。
    16 
    17     例如:extern int a;是对全局变量a的声明语句.
    18 
    19     extern "C"包含两重含义:
    20     1、被它修饰的目标是"extern"
    21     2、它修饰的目标是C
    22 
    23     对于全局变量和函数,C语言与C++语言的编译、连接方式不同:
    24     1、C++作为一种面向对象的语言,C++支持函数重载,而C语言则不支持。
    25        因此,全局变量或函数被C++编译后在符号库中的名字与C语言不同。
    26     2、C++除了支持全局变量外,还支持类的成员变量和局部变量。编译器在
    27     进行编译时,对局部变量是通过局部变量在栈上距帧指针ebp的偏移量进行反问的,
    28     对类的成员变量是通过其相对于对象首地址偏移量进行访问的。
    29 */
    1 /***** value.c ****/
    2 //因为是.c文件 所以对应于C的value()函数声明
    3 int value(){
    4     return 5;
    5 }

    在C中调用C++函数:

    1 /****invokecpp.h****/
    2 /*
    3     使用C编译符号规则
    4 */
    5 extern "C"{
    6     void show();
    7 }
     1 /****invokecpp.cpp*****/
     2 #include<cstdio>
     3 #include"invokecpp.h"
     4 /*
     5     为了让函数void show();能够被C语言程序调用,必须用
     6     extern"C" 通知编译器采用C语言的规则解析函数名,这个
     7     工作可在头文件invokecpp.h中完成。
     8 */
     9 void show(){
    10     printf("Hello");
    11 }
    /***main.c****/
    /*
        在C语言源文件main.c中,不能直接包含invokecpp.h
        因为C语言不支持extern "C"声明。在.c文件中包含了extern "C"时
        会出现编译错误。所以在main.c中,应直接进行函数原型声明,这样,
        编译器可在所有参与连接的目标文件中寻找名字为_show的函数调用。
    */
    void show();
    int main(){
        show();
    }
  • 相关阅读:
    一步一步配置 Dell OME 监控 Dell 服务器硬件报警
    比较详细的介绍zabbix监控tomcat
    Docker-03 docker 加速器--DaoCloud 1.0
    Docker-02 无人值守安装 docker
    Docker-01 无人值守升级 CentOS 6.x 系统内核到 3.10.x 长期支持版
    一个awk if 嵌套 if 的脚本
    CentOS 安装 JDK
    zTree默认勾选指定ID并执行事件
    数据库游标的使用
    js进度条实现
  • 原文地址:https://www.cnblogs.com/teng-IT/p/6023530.html
Copyright © 2011-2022 走看看