迷宫算法所引发的C++的学习

本文详细介绍了 C++ 中 define 和 const 的用法及区别,函数参数与返回指针的处理方式,以及 exit 函数的正确使用方法,并探讨了 STL 中 stack 的实现原理和 extern 的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、define 的用法和 const  的用法, 以及两者之间的区别。

1)#define 是预处理命令,是预处理程序过中被处理的指令,在源代码被编译器进行编译之前,需要预处理程序对源代码进行初步转换和一些处理,如包含的源文件等。其中预处理命令就有define ,还有以前遇到过的#ifdef    #endif 等命令。

2)const类型修饰符,用它定义了变量之后,这个变量将不能再被改变(突然想到 static 静态存储,是指该变量的值会在它的基础上进行操作,而不会一直是它初始化时的值)

接着又想到了在函数参数中也经常看到const修饰符,如 void display(const  Date&, const  char*)  参数声明为const型,可以确保被调用函数不破坏引用型参数原先的值。

还有以const 型引用作为返回值,const Date& getDate(int n){ return birthdays[n-1];}  这是防止调用者利用返回的引用修改被调用者的返回值

2,函数参数没有 具体的形式,只有数据类型?

调用函数其实给出函数返回类型及其参数数据类型就可以的,不需要给出形参的具体名字,给出名字是为了说明更加具体的含义。

3、函数返回指针的问题

函数返回指针,要使主程序可以使用这个指针来访问有意义的数据,关键就是要保证在使用这个指针值的时候,该指针所指向的地方的数据仍然有意义。
除了您所说的:用静态区以及用malloc这样的方法外,还有就是第二个例子里的:用常量区。再另外,还可以用全局变量,也就是说返回的指针是指向全局变量的。

常规程序中,函数返回的指针通常应该是:
(1)指向静态(static)变量;
(2)指向专门申请分配的(如用malloc)空间;
(3)指向常量区(如指向字符串"hello");
(4)指向全局变量;//在我的程序中就是返回给全局变量了
(5)指向程序代码区(如指向函数的指针)。 
除这5项以外,其它怪技巧不提倡。

http://zhidao.baidu.com/question/327940855.html

4、exit() 括号中的参数0,1 有什么不同

  exit用于在程序运行的过程中随时结束程序,函数原型void exit(int status),exit的参数是返回给操作系统的。这个参数识了应用程序的一些运行信息。
    和操作系统有关一般是0为正常退出,非0为非正常退出。非0的数字可以是自己拟定的可以是任意一个整型数字。通过这个参数用来标识程序是在那一部分退出的。
每个进程都会有一个返回值的. 进程开始时是由系统的一个启动函数掉用了main函数的:   int   nMainRetVal   =   main(); 当从main函数退出后,启动函数便调用exit函数,并且把nMainRetVa传递给它. 所以,任何时候都会调用exit函数的,正常情况下,main函数不会调用exit函数的,而是由return   0; 
返回值给nMainRetVal的,exit再接收这个值作为参数的.所以,正常情况下是以exit(0)退出的. 如果,你程序发生异常,你可以在main函数中调用exit(1),强制退出程序,强制终止进程.其中1表示不正常退出

5、stl中stack的实现的分析,本只想知道其中用什么数据结构实现的,结构挖出这篇文章来,真心大牛才能写的!

http://blog.youkuaiyun.com/housisong/article/details/505254

6、又遇到了无法解释外部符号的问题,上次是stdafx.h 引来的,这次是因为多个文件中用到了共同的变量引起的,有三个文件,A.h,声明了全局变量,在B.cpp和C.cpp中都包含了A.h,但是编译的时候出现了全局变量已经被引用的情况,查资料查到需要在另外模块中对变量加上extern 重新定义,但是好像又不是简单的状况,因为加上了之后就出现无法解释外部符号的问题,我也真的无法解释,最后解决方法是将B和C没办法下合并在一起,编译通过……泪奔啊。不过由此引发了对extern的了解,果然不是那么简单的。

这里有关于 无法解释外部符合别人整理的几种状况,但是没有我的状况:

http://blog.sina.com.cn/s/blog_5d51f4e90100z87w.html

对于extern C 的使用好想很复杂的样子,但是目前涉及到的很少,MS算法里面好像包含的,可见如果以后要从事更改的过程,还需要深究,此阶段先放一放。

后来又找到了一篇文章是说我这种状况的

http://www.cnblogs.com/A-Song/archive/2012/03/23/2413782.html

问题描述如下:

有 三个源文件,A.h、B.cpp、C.cpp。

A.h是头文件,其中声明了三个变量a1、a2、 a3。

B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件。B.cpp和C.cpp中均包含头文件 A.h。

在编译时,编译能够通过,但链接时出了问题,出现”error   LNK1169:   找到一个或多个多重定义的符号“的错误。

经过分析,确定了这是由于两个实现文件中重复包含了头文件而造成的。可解决方法却始终找不到。

要 注意的是,在这里,在头文件中加入#ifndef……#endif这样的预编译命令是没用的,因为这是防止嵌套包含头文件的,而本例中并没有嵌套包含,是 在两个文件中分别包含。

因为这三个变量在两个实现文件中都要用到,所以一定要包含在A.h中。后来在网上找到了解决方法,其实很简单。

就是在A.h中的三个变量声明前加上extern 关键字,然后在B.cpp中不加extern关键字再次声明这三个变量。于是编译链接顺利通过。

其实这是C++中比较基础的问题。
还有种情况是定义了函数,但在另个文件中准备用#include打开,但是结果还是会出现。

直接包含不就在两个cpp文件中都定义了相同的函数/变量吗,链接时会出现重复定义(你自己试试),所以需要使用extren申明一下即可,他们使用的是同一个实体。

例如:
1、你在a.cpp中定义了一个函数
void func()
{
}

希望在b.cpp中调用,调用前就需要进行声明,格式如下:
extren void func(); //extren 后面根的形式和函数定义形式要完全相同

void mian()
{
    func();
}

2、1、你在a.cpp中定义了一个变量  int a;

希望在b.cpp中使用,使用前就需要进行声明,格式如下:
extren int a; //extren 后面根的形式和变量定义形式要完全相同

void main()
{
    int b = a;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值