extern“c”的使用.docxVIP

  • 1
  • 0
  • 约6千字
  • 约 7页
  • 2016-11-27 发布于河南
  • 举报
extern“c”的使用

javascript:;W1083136246/mall/商城/link?url=KHRVx3k0vhwmSkSEt2t7I7gezr7IMr50paTPLkUftyd-D3Zgh31HlXEX-_Dokg0kUZXjarOJbwPZRPmrh7iq7_159extern“c”编辑extern C 是c++语言,包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。中文名不彻底地面向对象外文名extern C?类?别编程语言特?性软件开发目录1extern “c”2/link?url=KHRVx3k0vhwmSkSEt2t7I7gezr7IMr50paTPLkUftyd-D3Zgh31HlXEX-_Dokg0kUZXjarOJbwPZRPmrh7iq7_实例??/link?url=KHRVx3k0vhwmSkSEt2t7I7gezr7IMr50paTPLkUftyd-D3Zgh31HlXEX-_Dokg0kUZXjarOJbwPZRPmrh7iq7_一??/link?url=KHRVx3k0vhwmSkSEt2t7I7gezr7IMr50paTPLkUftyd-D3Zgh31HlXEX-_Dokg0kUZXjarOJbwPZRPmrh7iq7_extern C的惯用1extern “c”编辑含义(1) 被extern限定的函数或/view/296689.htm变量是/view/963932.htmextern类型的:a./view/963932.htmextern修饰变量的声明。/view/818854.htm举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externint v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明externint v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--/view/296689.htm变量的/view/657404.htm作用域。能够被其他模块以extern/view/2366445.htm修饰符引用到的变量通常是/view/261041.htm全局变量。还有很重要的一点是,/view/963932.htmexternint v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun/view/657404.htm作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。b./view/963932.htmextern修饰函数声明。从本质上来讲,/view/296689.htm变量和函数没有区别。/view/15061.htm函数名是指向函数二进制块开头处的/view/159417.htm指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,/view/963932.htmexternint fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中/view/15061.htm函数的引用,最常用的方法是包含这些函数声明的头文件。使用/view/963932.htmextern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直截了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C/view/421002.htm程序编译过程中,这种差异是非常明显的。(2) 被extern C修饰的变量和函数是按照C语言方式编译和连接的;未加extern“C”声明时的编译方式。首先看看C++中对类似C的函数是怎样编译的。作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:/view/1004734.htmvoid?foo( int x, int y );该函数被C/view/487018.htm编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都

文档评论(0)

1亿VIP精品文档

相关文档