1. C++ extern 的问题
extern 表示其后面接的变量或者函数"需要导出"或者"是一个外部的变量或函数"。
如果有头文件已经声明(采用函数或变量声明的方式),可以无需该关键字
该关键字是告知编译器,其后面的声明函数或变量来自本文件的外部,最后链接的时候再定位。
经典的应用场景在动态库导出或者外部变量引入。
下面是一个动态库导出的示例:
extern"C"intdllfunc();//以C函数接口的方式导出函数dllfunc
这样编译器在编译代码的时候,就会保留dllfunc的名称信息,方便其他模块调用此函数
下面是一个外部变量引入的示例:
externintg_total;//g_total是一个外部的整型变量
这样编译器在编译本代码的时候,并不会立刻定位g_total的实体位置,而是推迟到link阶段去解决实体位置问题。
对于函数引用声明,使用extern和不使用,在语法角度上没有本质区别。但是使用extern的函数,其名称信息为保留在生成好的目标文件中,可以被任何第三方使用者看到。
因此,如果不是有意将其作为接口,请不要使用该关键字,以免影响模块的安全性
对于变量,则必须要此关键字才能引用外部的变量,否则编译器会在此文件内声明一个同样名称的变量,并可能引发编译错误(同一名称空间中存在两个相同名称的变量)
2. c语言调用其他文件的函数怎么编译
调用函数库的话用#include<XXX.h>或者#include"XXX.h"区别是你库文件放在同一个文件夹还是在IDE的安装目录下面,如果你库文件在你工程文件夹里面用#include<XXX.h>,否则用#include"XXX.h"
如果你说自己写库的话是需要两个宏命令,#ifndef_XXX_H#define_XXX_H,然后你函数名用extern表示
如果你说编译的话,你应该说的是编译原理吧,你可以反汇编一下一个编译好的程序,如果该处编译了一个其他函数库的函数,你可以看到程序把参数PUSH到内存后CALL或者LCALL了一个这个函数的地址,这就完成了汇编中调用函数的部分,我记得X86里面CALL的机器码是E8H吧,有兴趣的话可以自己用反汇编看一下
这个CALL的话就是调用函数的功能