extern终于搞懂了:1同一个工程一个c文件函数调用另一个c文件函数 2 c调用c++函数

来源:互联网 发布:佳能相机镜头 知乎 编辑:程序博客网 时间:2024/05/19 11:48

1 #include头文件了,不就行了吗.如 c库函数??? why用extern呢.

如PowerSetDemo.cpp 调用powerSet1.cpp中的GetPowerSet,

有两种方法,方法1:#include powerSet1.h

方法2:extern void GetPowerSet. 不用#include powerSet1.h.这样就不会引入大量的无关函数.

这是在编译的时候。在link时候,在makefile中需要PowerSetDemo.o和powerSet1.o在一起


extern include引用函数的头文件。同时保证工程中,这个函数是唯一一个。工程中的其他文件,引用同一个工程中的这个文件的函数,用extern.

c库函数应该做了特殊处理。理论上讲 #include c 库函数,也应该extern。工程内保证唯一,变成的函数放到自己,h文件对应.o 中.谁调用谁都在这个.o中找.


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

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


njcgpc:felixzh/temp/ctest >> cat assert.c
#include <assert.h>
extern int a;
main ()
{
        printf("line6:a=%d\n",a);
        assert(a==1);
        printf("line10:a=%d\n",a);
}
njcgpc:felixzh/temp/ctest >> cat b.c 
int a=0;
njcgpc:felixzh/temp/ctest >> cat a.c
int a=1;


当gcc assert.c b.c a.c 将三个文件一起编译,这样三个文件看成一个工程。
这样在b.c中定义的a变成全局变量,同样也在a.c中定义的a变成全局变量。
这样造成整个工程的全局变量冲突错误.


njcgpc:felixzh/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


3 cscdMtMgrProc.cc  在c++中定义,实现. 用extern告诉编译器这个用函数用c函数的方式编译,不用c++的方式 。如不用fun1_int_long.这样c函数可以调用

extern "C" bool isMtMother(void);

bool isMtMother(void)
{
  return (CscdMtMgr::getInstance()->getMtMgrMode() == MT_MGR_MOTHER);
}

在extLfCmdProc.cc 中将调用这个函数

extern bool isMtChild(void);

  if (isMtChild()){

......

}

0 0