ckground: white;">color: blue; line-height: 150%; font-family: Verdana;">1 color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">基本解释color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">可以置于变量或者color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">前c;以标示变量或者color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的定义在别的文件中c;提示class="tags" href="/tags/BianYiQi.html" title=编译器>编译器遇到此变量和color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">时在其他模块中寻找其定义。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 另外c;color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">也可用来进行链接指定。color: blue; line-height: 150%; font-family: Verdana;">
ckground: white;">color: blue; line-height: 150%; font-family: Verdana;">2 color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">问题:color: blue; line-height: 150%; font-family: Verdana;">extern color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">变量color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 在一个源文件里定义了一个数组:color: blue; line-height: 150%; font-family: Verdana;">char a[6];
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 在另外一个文件里用下列语句进行了声明:color: blue; line-height: 150%; font-family: Verdana;">extern char *acolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">;color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 请问c;这样可以吗?color: blue; line-height: 150%; font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">
ckground: white; margin-bottom: 14pt;">color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 答案与分析:color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">1)color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">、不可以c;程序运行时会告诉你非法访问。原因在于c;指向类型color: blue; line-height: 150%; font-family: Verdana;">Tcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">指针color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">并不等价于类型color: blue; line-height: 150%; font-family: Verdana;">Tcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的数组。color: blue; line-height: 150%; font-family: Verdana;">extern char *acolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">声明的是一个color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">指针color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">变量而不是字符数组c;因此与实际的定义不同c;从而造成运行时非法访问。应该将声明改为color: blue; line-height: 150%; font-family: Verdana;">extern char a[ ]color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">2)color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">、例子分析如下c;如果color: blue; line-height: 150%; font-family: Verdana;">a[] = "abcd",color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">则外部变量color: blue; line-height: 150%; font-family: Verdana;">a=0x61626364 (abcdcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的color: blue; line-height: 150%; font-family: Verdana;">ASCIIcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">码值color: blue; line-height: 150%; font-family: Verdana;">)color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">c;color: blue; line-height: 150%; font-family: Verdana;">*acolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">显然没有意义color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 显然color: blue; line-height: 150%; font-family: Verdana;">acolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">指向的空间(color: blue; line-height: 150%; font-family: Verdana;">0x61626364color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">)没有意义c;易出现非法内存访问。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">3)color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">、这提示我们c;在使用color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">时候要严格对应声明时的格式c;在实际编程中c;这样的错误屡见不鲜。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">4)color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">、color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">用在变量声明中常常有这样一个作用c;你在color: blue; line-height: 150%; font-family: Verdana;">*.ccolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">文件中声明了一个全局的变量c;这个全局的变量如果要被引用c;就放在color: blue; line-height: 150%; font-family: Verdana;">*.hcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">中并用color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">来声明。color: blue; line-height: 150%; font-family: Verdana;">
ckground: white;">color: blue; line-height: 150%; font-family: Verdana;">4 color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">问题:color: blue; line-height: 150%; font-family: Verdana;">extern color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数2
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 当color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">提供方单方面修改color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">原型时c;如果使用方不知情继续沿用原来的color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">申明c;这样编译时class="tags" href="/tags/BianYiQi.html" title=编译器>编译器不会报错。但是在运行过程中c;因为少了或者多了输入参数c;往往会照成系统错误c;这种情况应该如何解决?color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 答案与分析:color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 目前业界针对这种情况的处理没有一个很完美的方案c;通常的做法是提供方在自己的color: blue; line-height: 150%; font-family: Verdana;">xxx_pub.hcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">中提供对外部color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">接口color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的声明c;然后调用方color: blue; line-height: 150%; font-family: Verdana;">class="tags" href="/tags/INCLUDE.html" title=include>includecolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">该头文件c;从而省去color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">这一步。以避免这种错误。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 宝剑有双锋c;对color: blue; line-height: 150%; font-family: Verdana;">externcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的应用c;不同的场合应该选择不同的做法。color: blue; line-height: 150%; font-family: Verdana;">
ckground: white;">color: blue; line-height: 150%; font-family: Verdana;">5 color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">问题:color: blue; line-height: 150%; font-family: Verdana;">extern “C”
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 在color: blue; line-height: 150%; font-family: Verdana;">color: blue;">C++color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">环境下使用color: blue; line-height: 150%; font-family: Verdana;">Ccolor: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的时候c;常常会出现class="tags" href="/tags/BianYiQi.html" title=编译器>编译器无法找到color: blue; line-height: 150%; font-family: Verdana;">objcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">模块中的color: blue; line-height: 150%; font-family: Verdana;">Ccolor: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">定义c;从而导致链接失败的情况c;应该如何解决这种情况呢?color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 答案与分析:color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">color: blue;">C++color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">class="tags" href="/tags/YuYan.html" title=语言>语言在编译的时候为了解决color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的多态问题c;会将color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">名和参数联合起来生成一个中间的color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">名称c;而color: blue; line-height: 150%; font-family: Verdana;">color: blue;">Ccolor: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">class="tags" href="/tags/YuYan.html" title=语言>语言color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">则不会c;因此会造成链接时找不到对应color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">的情况c;此时color: blue; line-height: 150%; font-family: Verdana;">Ccolor: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">就需要用color: blue; line-height: 150%; font-family: Verdana;">extern “C”color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">进行链接指定c;这告诉class="tags" href="/tags/BianYiQi.html" title=编译器>编译器c;请保持我的名称c;不要给我生成用于链接的中间color: blue; line-height: 150%; font-family: Verdana;">color: blue; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">函数color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">名。color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> 下面是一个标准的写法:color: blue; line-height: 150%; font-family: Verdana;">
//color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">在color: blue; line-height: 150%; font-family: Verdana;">.hcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">文件的头上color: blue; line-height: 150%; font-family: Verdana;">
#ifdef __cplusplus
#if __cplusplus
extern "C"{
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">#endif
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">#endif /* __cplusplus */
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">…
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">…
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">//.hcolor: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN">文件结束的地方color: blue; line-height: 150%; font-family: Verdana;">
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">#ifdef __cplusplus
color: blue; line-height: 150%; font-family: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana;" lang="ZH-CN"> color: blue; line-height: 150%; font-family: Verdana;">#if __cplusplus
}
#endif
#endif /* __cplusplus */