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;
}