2009年9月20日
今天写了个程序用了如下代码
#include <iostream.h>
using namespace std;
然后编译时出现 error C2871: 'std' : does not exist or is not a namespace
查了一下,原来 C++有两个不同版本的头文件。引入名字空间这个概念以前编译器用的是#include <iostream.h>,
而引入名字空间的概念以后std名字空间的头文件名字变成了<iostream>。
<iostream.h>是比较老的C++的头文件的版本,而namespace是98年才被加入C++标准的,所以<iostream.h>里面是没有std这么个命名空间的,当使用 <iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现。头文件<iostream>则没有定义全局命名空间,使用时必须使用namespace std才能正确使用cout。
vc6.0支持这个两个版本. 不过现在都用<iostream>了
所以只需将以上语句改为:
#include <iostream>
using namespace std;
或者是 #include <iostream.h>即可。
2009年9月11日
C语言书中写到在定义二维数组时,可以省略第一维的坐标,如 int a[][3] = {{4,1,6},{2,3,5}}; 是合法的
但是不可以省略二维或者更高维的坐标。 如 int a[3][] = {{4,1,6},{2,3,5}}; 是不合法的
这是由编译器原理限制的。 如 定义a[2][3], 在我们引用数组元素a[1][2]时 编译器的寻址方式是 a+ 1*3+2,若不指定第二维
则编译器将不知道数组的列数也就无法寻址。
2009年9月9日
C编译的整个过程很复杂,大致可以分为以下四个阶段:
1)预处理阶段
在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。
2)编译、优化阶段
编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。
优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。
3)汇编阶段
将汇编语言翻译成机器指令
4)链接阶段
链接阶段的主要工作是将有关的目标文件连接起来,即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的目标文件成为一个能够被操作系统装入执行的统一整体。