ImageVerifierCode 换一换
格式:DOCX , 页数:7 ,大小:18.08KB ,
资源ID:3845762      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3845762.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌套文件包含.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌套文件包含.docx

1、嵌套文件包含#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include x.h#include x.h显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:#include a.h#include b.h看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也同样被包含了两次,只不过它的形式不是那么明显而已。多重包含在绝大多数情况下出现在大型程序中,它往往需要使用很多头文件,因此要发现重复包含并不容易。要解决这个问题,我们可以使用条件编译。如果所有的头文件都像下面这样编写:#ifndef _

2、HEADERNAME_H#define _HEADERNAME_H./(头文件内容)#endif那么多重包含的危险就被消除了。当头文件第一次被包含时,它被正常处理,符号_HEADERNAME_H被定义为1。如果头文件被再次包含,通过条件编译,它的内容被忽略。符号_HEADERNAME_H按照被包含头文件的文件名进行取名,以避免由于其他头文件使用相同的符号而引起的冲突。但是,你必须记住预处理器仍将整个头文件读入,即使这个头文件所有内容将被忽略。由于这种处理将托慢编译速度,所以如果可能,应该避免出现多重包含。test-1.0使用#ifndef只是防止了头文件被重复包含(其实本例中只有一个头件,不会

3、存在重复包含的问题),但是无法防止变量被重复定义。# vi test.c-#include #include test.hextern i;extern void test1();extern void test2();int main()test1();printf(ok/n);test2();printf(%d/n,i);return 0;# vi test.h-#ifndef _TEST_H_#define _TEST_H_char add1 = char add2 = int i = 10;void test1();void test2();#endif# vi test1.c-#in

4、clude #include test.hextern char add1;void test1()printf(add1);# vi test2.c-#include #include test.hextern char add2;extern i;void test2()printf(add2);for (; i 0; i-) printf(%d-, i);# Makefile-test: test.o test1.o test2.otest1.o: test1.ctest2.o: test2.cclean:rm test test.o test1.o test2.o错误:test-1.0

5、编译后会出现multiple definition of错误。错误分析:由于工程中的每个.c文件都是独立的解释的,即使头文件有#ifndef _TEST_H_#define _TEST_H_.#enfif在其他文件中只要包含了global.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。解决方法在.c文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c文件中包含.h文件。编译器会为.c生成目标文件,然

6、后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件 。test-2.0# vi test.c-#include #include test.hint i = 10;char add1 = char add2 = extern void test1();extern void test2();int main()test1();printf(ok/n);test2();printf(%d/n,i);return 0;# vi test.h-#ifndef _TEST_H_#define _TEST_H_extern i;extern char add1;extern char a

7、dd2;void test1();void test2();#endif# vi test1.c-#include #include test.hvoid test1()printf(add1);# vi test2.c-#include #include test.hvoid test2()printf(add2);for (; i 0; i-) printf(%d-, i);二、链接指示符:extern如果希望调用其他程序设计语言(尤其是C)写的函数,那么,调用函数时必须告诉编译器使用不同的要求.例如,当这样的函数被调用时,函数名或参数排列的顺序可能不同,无论是C+函数调用它,还是用其他语

8、言写的函数调用它.程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的.链接指示符有两种形式:单一语句(single statement)形式复合语句(compound statement)形式当复合语句链接指示符的括号中包含有#include时,在头文件中的函数声明都被假定是用链接指示符的程序设计语言所写的.链接指示符不能出现在函数体中.vi externC.cpp-#include extern C double sqrt(double);int main()using std:cout;using std:endl;double resu

9、lt = sqrt(25);cout result = result endl;return 0;g+ externC.cpp如果我们希望C+函数能够为C程序所用,我们也可以使用extern C链接指示符来使C+函数为C程序可用.作为一种面向对象的语言,C+支持函数重载,而过程式语言C则不支持。函数被C+编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo(int x, int y); 该函数被C编译器编译后在symbol库中的名字为_foo,而C+编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数

10、数量及类型信息,C+就是靠这种机制来实现函数重载的。为了实现C和C+的混合编程,C+提供了C链接交换指定符号extern C来解决名字匹配问题,函数声明前加上extern C后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C+的函数了。cppExample.h-#ifndef CPP_EXAMPLE_H#define CPP_EXAMPLE_H/被extern C限定的函数或变量首先是extern类型的;extern是C/C+语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。/被extern C

11、修饰的变量和函数是按照C语言方式编译和连接的;extern C int add(int x, int y);/extern int add(int x, int y);#endifcppExample.cpp-#include cppExample.hint add( int x, int y )return x + y;cFile.c-#include /这样会编译出错/#include cppExample.hextern int add(int x, int y);int main(int argc, char* argv)printf(%d/n, add(2, 3);return 0;

12、-gcc cFile.c cppExample.cpp三、变量定义与声明的区别我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:变量的声明有两种情况:(1) 一种是需要建立存储空间的(定义、声明)。例如:int a在声明的时候就已经建立了存储空间。 (2) 另一种是不需要建立存储空间的(声明)。例如:extern int a其中变量a是在别的文件中定义的。前者是定义性声明(defining declaration)或者称为定义(definition),而后者是引用性声明(refe

13、rncing declaration)。从广义的角度来讲声明中包含着定义,但是并非所有的声明都是定义,例如:int a它既是声明,同时又是定义。然而对于extern a来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为定义,而把不需要建立存储空间称之为声明。很明显我们在这里指的声明是范围比较窄的,也就是说非定义性质的声明。例如:在主函数中 int main()extern int A; /这是个声明而不是定义,声明A是一个已经定义了的外部变量/注意:声明外部变量时可以把变量类型去掉如:extern A;dosth(); /执行函数int A; /是定义,定义了A为整型

14、的外部变量(全局变量) 外部变量(全局变量)的定义与外部变量的声明是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在定义中进行,而不是在声明中。所谓的声明,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是在为了提前引用该变量而作的声明而已。extern只作声明,不作定义。 用static来声明一个变量的作用有二:(1) 对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在(2) 外部变量用static来声明,则该变量的作用只限于本文件模块

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1