C/C++
iverson_1
这个作者很懒,什么都没留下…
展开
-
程序执行过程
要理解一个程序的执行过程,首先要理解什么是编译器。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此,必须 将C语言转换为机器语言。编译器就是用来实现这一功能的。编译器将源代码文件按照一定的对应规则映射程计算机能够识别的二进制指令。关于源文件、目标文件和可执行文件源文件:保存源代码的文件(*.c, *.cpp)目标文件:编译器根据源文件创建的机器语言指令成为目标代码,包含目标代码的磁盘文件即目标文件。 一般为(*.obj)文件,Linux下为(*.o)文件。编转载 2010-06-28 08:34:00 · 2155 阅读 · 1 评论 -
extern "C"
<br />extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。 <br />(1) 被extern "C"限定的函数或变量是extern类型的;<br /> extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。<br /> 记住,下列语句: <br />转载 2010-06-23 14:46:00 · 369 阅读 · 0 评论 -
声明和定义
在声明部分出现变量有两种情况: (1)一种是需要建立存储空间的,如:int a; (2)另一种是不要建立存储空间的,如:extern int a; 前者是"定义性声明" (defining declaration), 或者称为"定义"(definition); 后者是"引用性声明" (referencing declaration). 广义地说,声明包括定义,但并非所有的声明都是定义.对"int a;"来说,它既是定义又是声明; 对"extern a;"而言,它是声明不是定义. 一般为了叙述方便转载 2010-06-23 19:27:00 · 623 阅读 · 0 评论 -
sizeof和strlen
一、好首先看看sizeof和strlen在MSDN上的定义:首先看一MSDN上如何对sizeof进行定义的:sizeof Operatorsizeof expressionThe sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type s转载 2010-07-20 16:16:00 · 373 阅读 · 0 评论 -
export
<br />1.函数模版的编译模式分两种:完包含编译模式和局部编译模式(需要用export关键字) <br />2.不同的编译器对这两种编译模式的支持各不相同,但一般都支持完全包含编译模式(vc6.0就不支持export),具体支持情况需要参照具体使用的编译器文档 <br /><br />模版函数和普通函数在使用的时候有一定的区别: <br />(1)普通函数在使用的源文件中直接include该函数的声明即可 <br />(2)模版函数在使用的源文件中既要include模版函数的转载 2010-07-04 20:50:00 · 476 阅读 · 0 评论 -
explicit
<br /> 在 C++ 中, 如果一个类有只有一个参数的构造函数,C++ 允许一种特殊的声明类变量的方式。在这种情况下,可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据转换为类的对象。 如果在构造函数前加上 explicit 修饰词, 则会禁止这种自动转换,在这种情况下, 即使将对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。<br /> 下面以具体实例来说明。<br /> 建立people.cpp转载 2010-06-29 13:19:00 · 453 阅读 · 0 评论 -
编程细节
1.在使用STL的迭代器进行累加时,最好使用前置式递增:++iter 代替后置式递增:iter++,因为他比后者效率高,后者需要创建一个临时对象,因为它必须保存迭代器的原本位置并将它返回;原创 2010-06-30 10:53:00 · 391 阅读 · 0 评论 -
volatile
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这转载 2010-06-29 14:56:00 · 336 阅读 · 0 评论 -
mutable
<br />关键字mutable的中文意思是:“可变的、易变的”与constant(即C++中const)是反义词。C++中的mutable是为了突破const限制而设置的,被mutable修饰的变量将永远处于可变状态,即使是位于const修饰的函数中。mutable又是一个奇怪的修饰符(specifier),它只能够用于一个类的非静态数据成员。下面我将讨论mutable 的语义和用法,但是首先我要解释一下 C++ 对象模型的一个关键概念。<br />对象的状态<br />转载 2010-06-29 14:34:00 · 1060 阅读 · 0 评论 -
关于动态语言和静态语言、强类型定义语言和弱类型定义语言的概念区分
<br />1、动态语言和静态语言<br /> 通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。<br />(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。<br />(2)静态类型语言:静态类型语言与动态类型语言刚转载 2010-06-28 11:18:00 · 456 阅读 · 0 评论 -
为什么需要头文件? and 重定义问题
首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面)那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了.如果一个.cpp要用到另一个.c转载 2010-06-28 09:00:00 · 1557 阅读 · 0 评论 -
inline
定义<br />内联函数从源代码层看,有函数的结构,而在编译后,却不具体函数的性质。编译时,类似宏替换地,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体处理。实现<br />有两种实现方式: <br />1.在类声明的内部声明,而在类声明外部定义叫做显式内联函数,如: <br />class display <br />{ <br /> int t; <br /> public转载 2010-06-27 16:53:00 · 472 阅读 · 0 评论 -
#ifdef、#ifndef、#if
这几个宏是为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif 它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2 其中#else部分也可以转载 2010-06-24 09:51:00 · 500 阅读 · 0 评论