美文网首页
extern详解

extern详解

作者: mfdalf | 来源:发表于2020-12-29 19:17 被阅读0次
冰雪.jpg

目录

1同一个工程一个c文件函数调用另一个c文件函数

2 c文件调用另一个c文件变量

3 c++调用c函数

4 c 调用c++函数

正文

1 extern 函数

为什么要用extern 函数呢?#include头文件不就行了吗 ?比如 c库函数, 引用c库函数啥时候用extern呢?

下面让我们看个例子,如PowerSetDemo.cpp 想调用powerSet1.cpp中的GetPowerSet函数,

有两种方法:

方法1:include 头文件 ; #include powerSet1.h

方法2: extern 方法 . extern void GetPowerSet.这句在调用文件中使用,表示引用全局函数GetPowerSet().

不用#include powerSet1.h. 这样就不会引入大量头文件,进而不会引入大量的无关函数.这样写编译不会出错。在makefile中需要PowerSetDemo.o和powerSet1.o写在一起,否则link的时候找不到GetPowerSet而报错。

2 extern 变量

2.1 当gcc assert.c b.c 将两个文件一起编译,这样两个文件看成一个工程。

这样在b.c中定义的a变成全局变量,在assert.c 中用extern ,表示引用依赖相关的.o中global a这个变量,本例即b.c中的变量a。gcc 编译后,a.out会从b.o,assert.o 中自动查找。不用user care。

2.2 当gcc assert.c b.c a.c 将三个文件一起编译,这样三个文件看成一个工程。

这样在b.c中定义的a变成全局变量,同样也在a.c中定义的a变成全局变量。
这样造成整个工程的全局变量冲突错误.
njpc:felix/temp/ctest >127> gcc assert.c a.c b.c
/var/tmp//ccg3SW15.o:(.bss+0x0): multiple definition of `a'
/var/tmp//ccOJUg1q.o:(.data+0x0): first defined here

collect2: ld returned 1 exit status

2.3 将global a变量放到common.h中,各个文件引用common.h 是不是可以共享全局变量呢?

答案是不能。比如ab.cpp ,cd.cpp 都#include common.h造成,编译ab.cpp,cd.cpp 的时候都编译int global a,所以造成重复定义的error。
唯一正确的方式:改用在一个cpp中extern int global;这样整个工程都有了这个符号,各个文件都可以调用

这就是变量和函数的区别,变量就是不能用#include 头文件的方法了,c库函数全是函数,可没有c库变量哈。

3 c++引用c 函数

在c++中使用extern,告诉编译器这个用函数用c函数的方式编译,不用c++编译方式编译 (比如编译成isMtMother,不是isMtMother_void.)

定义文件a.c

extern "C" bool isMtMother(void);
bool isMtMother(void)
{
  return (CscdMtMgr::getInstance()->getMtMgrMode() == MT_MGR_MOTHER);
}
image.gif

调用文件b.c

extern bool isMtChild(void);

  if (isMtChild()){

......

}
image.gif

4 c 调用c++函数

不能直接调用,需要加一层wrapper. 将c++头文件函数,添加extern "c",按照c的方式编译. 然后用wrapper调用c++.

ifdef __cplusplus

extern "C"

{

endif

.....

ifdef __cplusplus

}

endif

参见:https://www.cnblogs.com/lsgxeva/p/11162225.html

http://www.cnblogs.com/renyuan/archive/2012/11/30/2796801.html

相关文章

  • AndFix实现原理详解[二]

    实现原理核心代码详解(davlik部分) 1、c++背景知识介绍 extern关键字 extern可置于变量或者函...

  • extern详解

    通常在模块的头文件中对本模块供给其他模块引用的函数和全局变量以关键字extern声明。C++为了与C兼容,会将在e...

  • extern详解

    目录 1同一个工程一个c文件函数调用另一个c文件函数 2 c文件调用另一个c文件变量 3 c++调用c函数 4 c...

  • [转]C++中的extern “C”用法详解

    原文 这篇文章主要介绍了C++中的extern “C”用法详解,简单来说,extern “C”是C++声明或定义C...

  • C/C++常见问题记录

    C/C++ 语法 extern “C”的作用详解[https://www.cnblogs.com/xiangtin...

  • const,static,extern详解

    一、�const详解 �如果试图修改由const修饰符修饰所声明的变量,编译器会报错。�const修饰符修饰的指针...

  • Android NDK 开发之JNI常规操作

    1. JNI函数详解 java中native方法在C++代码中一般如下: 1. extern "C" 说明 表示下...

  • const,static,extern 的详解

    最近写代码,看到很多地方都用到const,决定写一遍文章记录一下 首先看到const,我们就想到宏,先看看宏和co...

  • extern & const

    一、extern是什么 extern int a = 200;是定义 extern int a; 是声明;声明是没...

  • 问题记录:FOUNDATION_EXTERN、UIKIT_EXT

    问题记录:FOUNDATION_EXTERN、UIKIT_EXTERN和extern使用 Fig-01中定义fun...

网友评论

      本文标题:extern详解

      本文链接:https://www.haomeiwen.com/subject/hvjqoktx.html