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

    extern的问题在于你不知道这个关键字出现的时候到底是声明还是定义。 
    谨记:声明可以多次,但是定义只能有一次。

    函数的声明extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的。

    下面分变量和函数来说明: 
    (1) 变量 
    extern int a; //声明一个全局变量 
    int a; //定义一个全局变量

    extern int a = 0;//定义全局变量并给初值 
    int a = 0; //定义全局变量并给初值 
    上面的四个只有第一个extern int a才是声明,其他的全是定义。 
    当你要引用一个全局变量时,你就要声明extern int a;这个时候extern不能省,否则就成定义了。

    (2) 函数 
    函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的。

    extern “C”: 
      作为C语言的扩展,C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的设计语言,为了支持函数的重载,C++对全局函数的处理方式有着明显的不同。 
      首先看一下C++对类似C的函数是怎样编译的: 
      作为面向对象的语言,C++为了支持函数重载,函数在被C++编译后在符号库中的名字与C语言的不同。假如某个函数的原型为void foo(int x, int y);该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生_foo_int_int之类的名字。_foo_int_int这样的名字是包含了函数名以及形参,C++就是靠这种机制来实现函数重载的。 
      被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。

    extern “C”的惯用法: 
    (1) 在C++中引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),需进行以下处理: 
      extern "C" 
      { 
        #include "cExample.h"; 
      }

      而在C语言的头文件中,对其外部函数只能指定为extern,C语言中不支持extern “C”,会报编译错误。

      笔者编写的C++引用C函数的例子工程,包含的三个文件如下 
      /* c语言头文件:cExample.h */ 
      #ifndef C_EXAMPLE_H 
      #define C_EXAMPLE_H 
      extern int add(int x, int y); 
      #endif

      /* c语言的实现文件:cExample.c */ 
      #include "cExample.h" 
      int add(int x, int y) 
      { 
        return x + y; 
      }

      /* c++实现文件,调用add:cppFile.cpp */ 
      extern "C" 
      { 
        #include "cExample.h"; 
      } 
      int main() 
      
        
    add(2, 3); 
        return 0; 
      } ` 
      如果C++调用一个C语言编写的.DLL时,在包含.DLL的头文件或声明接口函数时,应该也要加上extern “C”。

    (2) C中引用C++语言中的函数或者变量时,C++的头文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”的该头文件,应该仅在C中将C++中定义的extern “C”函数声明为extern类型。

      笔者编写的C引用C++函数的例子工程,源文件代码如下: 
      /* c++头文件cppExample.h */ 
      #ifndef CPP_EXAMPLE_H 
      #define CPP_EXAMPLE_H 
      extern "C" int add(int x, int y); 
      #endif

      /* c实现文件cFile.c */ 
      extern int add(int x, int y); 
      int main() 
      { 
        add(2, 3); 
        return 0; 
      }

     
  • 相关阅读:
    hdu2151
    hdu1028
    hdu1398
    hdu1465
    hdu2853
    poj2195
    poj2255
    JS正则校验数字,特殊字符,邮箱基本格式
    JS正则校验数字,特殊字符,邮箱基本格式
    io读取文件内容乱码处理
  • 原文地址:https://www.cnblogs.com/liangyc/p/11628280.html
Copyright © 2011-2022 走看看