随笔 - 46  文章 - 39  trackbacks - 0
<2021年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(2)

随笔分类

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

例子:

环境:linux
编译器:gcc
源码:hello.c

1 #include <stdio.h>
2 
3 int main()
4 {
5       printf("hello, world\n");
6 }


:~$ gcc -o hello hello.c

1、 源码文件hello.c           通过预处理器->修改过的源码文件hello.i
2、                     hello.i   通过编译器->汇编代码hello.s
3、                    hello.s   通过汇编器->浮动文件hello.o
4、        hello.o+printf.o   通过连接器->可执行文件hello。



1、预处理阶段    预处理器(cpp)根据#后面的指令修改源代码。例:hello.c中的#include <stdio.h> 命令告诉预处理器把系统头文件stdio.h插入到程序中生产另外一个C程序,一般后缀名为.i。

2、编译阶段       编译器(cc1)把hello.i文件转化成汇编代码hello.s文件。

3、汇编阶段       汇编器(as)把hello.s转化成机器语言指令浮动文件程序hello.o。

4、连接阶段       hello程序调用了标准C库printf函数。连接器(ld)把printf.o和hello.o连接成hello可执行文件。
posted @ 2012-05-24 14:10 canaan 阅读(2051) | 评论 (2)编辑 收藏
本书的目标读者是那些希望自己变得更有效、更多产的程序员。或许你在因为不能实现自己的潜力而沮丧。或许你看到你的同事使用来使它们比你更多产。也许你当前的工作使用比较老的技术,你想知道怎样把教新的思想应用于你的工作。

我们不会假装拥有所有(或大部分)的答案,我们的观念也不会适用于所有的情况。我们所能说的只是,如果你遵循我们的方法,你将会快速的获得经验,你的生产力将会提高,会对整个开发过程更加理解。你将能编写更好的软件。
posted @ 2012-04-17 12:40 canaan 阅读(1608) | 评论 (0)编辑 收藏
序言

本书将会帮助你成为一个更好的程序员

不管你是个人开发者,还是大项目团队中的一员,或者是同时为很多客户共事的顾问。本书将会帮助你,作为一个人体,更好地完成工作。本书不是理论书籍--我们专注于实际问题,利用你的经验作出更有见识的决定。pragmatic词来自拉丁语的pragmaticus--“商业技巧”--后者又源于希腊(...),意思是“去做。”这是一本关于“去做(doing)”的书。

编程是一门手艺。用最简单的话来说就是让计算机做你(或者用户)想让它做的事情。作为一个程序员,你既是聆听者,又是顾问,既是翻译员,又是专制者。你尝试着捕捉这些难以捉摸的需求,用一种方法来描述它们,让一台纯粹的机器能够合理的处理它们。你尝试着记录你的工作,以使他人能够理解它;你还尝试着策划你的工作,以使他人能够在上面构建。另外,你尝试着在项目时钟的冷酷地催逼下完成这些工作。你每天都在创造小奇迹。

这是一个困难的工作

很多人声称要给你提供帮助。工具供应商吹捧他们的产品所展现出来的奇迹。方法学大师承诺他们的技术保证有效。每个人都声称他们的编程语言是最好的,而每个操作系统都是这些问题的可信赖的解答。

当然,这些都不是真的。没有这么简单的答案。不存最好的解决方案,无论是工具,语言,或者一个操作系统。而存在的只是在某些特定的环境下更为合适的系统。

这就是务实的开始。你不应该局限于任何特定的技术,而是应该拥有足够宽广的背景和经验基础来为特定的情况选择一种好的解决方案。你的背景源自于对计算机科学基本原则的理解,你的经验来自于广泛的实际项目。理论与实践的结合使你变得强大。

你调整方法来适应当前的情形与环境。你判断这些所有因素中相对重要的因素来影响项目,使用你的经验来制作适合的解决方案。你随着工作的进展持续着这些活动。务实的程序员不仅要完成工作,而且要做的漂亮
posted @ 2012-04-17 12:01 canaan 阅读(1596) | 评论 (0)编辑 收藏
《The Pragmatic Programmer》 From Journeyman to Master
《务实的程序员》 从工人到大师

或《程序员修炼之道》 从小工到专家

作者:   【美】 Andrew Hunt   David Thomas
出版社:  Addison Wesley

第一版 1999年10月13日

务实的程序员通过现代软件开发中日益增长的的规范和技术细节来检查核心过程--根据需求来创建用户可工作和乐于维护的代码。本书包含了个人责任到职业发展到用架构技术来保持你的代码灵活,易于修改和重用。阅读本书,你将会学到

为软件变质做斗争;

避免重复知识陷阱;

编写灵活,动态,和易适应的代码;

避免靠巧合编程;

用合约,断言,和异常来保护你的代码;

捕捉真实的需求;

严格并且有效地进行测试;

让你的用户开心;

组建务实程序员团队;和

用自动化使开发过程更精确。


本书由一系列独立的章节组成,其间充满了有趣的轶事,周到的例子,和有趣的模拟,《务实的程序员》描述了软件开发的许多不同方面的最佳实践和主要问题。不管你是新手,还是有经验的程序员,或者是对软件项目有责任的经理,通过每日学习这些课程,都将会在个人生产力,准确性和工作满意度快速提升。你将会学到技能和开发习惯和态度为你的职业生涯中取得长期成功奠定基础。你将会成为一个务实的程序员。

 
posted @ 2012-04-17 10:26 canaan 阅读(1548) | 评论 (0)编辑 收藏
CColorDialog Class 颜色对话框类

VS2008

允许你将颜色选择对话框加入到你的应用程序中。


class CColorDialog : public CCommonDialog


备注

CColorDialog对象是一个具有一列定义在显示系统中的颜色的对话框。用户可以从列中选择或者创建特定的颜色,在对话框退出时报告返回给应用程序。

使用提供的构造函数或派生一个新类然后使用你自己的构造函数,来构建一个CColorDialog对象。

一旦对话框创建完成,你可以设置或修改m_cc结构中的任何值来初始化对话框控件的值。该m_cc结构类型是CHOOSECOLOR. 。

初始化对话框控件后,调用DoModal成员函数来显示对话框,并允许用户选择一种颜色。DoModal返回用户的选择对话框的OK(IDOK)或者Cancel(IDCANCEL)按钮。

如果DoModal返回IDOK,你可以使用CColorDialog方法来找回由用户输入的信息。

你可以使用Windows CommDlgExtendedError函数来决定不管错误发生在对话框初始化过程中并了解更多有关的错误。

CColorDialog依赖COMMDLG.DLL文件映射Windows版本3.1更高版本。

从CColorDialog派生一个类,自定义对话框。提供自定义对话框模板,并添加消息映射来处理从扩展控件来的通知消息。任何未处理的消息应该传递给基类。

笔记:
如果你使用框架使其他对话框对象变成灰色,在某些CColorDialog安装对象将不显示一个灰色背景。

使用CColorDialog需要更多的信息,参见Common Dialog Classes

需求
头文件:afxdlgs.h

只能设备开发笔记

这个类只支持Windows CE标准SDK。它不支持Windows Mobile Pocket PC或者智能手机平台。智能设备版本CColorDialog类不支持下面方法:
CColorDialog::SetCurrentColor


参见
概念
posted @ 2012-04-05 19:17 canaan 阅读(2432) | 评论 (0)编辑 收藏
随机访问容器

容器
类目:容器

描述
随机访问容器是一个迭代器类型为随机访问迭代器的可逆容器。它提供常量缓冲时间来访问随机元素。

改善自

可逆容器

相关类型

除了定义在可逆容器中的类型,没有其他额外类型。尽管这个迭代器类型的需求加强了:必须是随机访问迭代器。

标记法

X 随机访问容器模型类型
a,b X类型对象
T X类型的值

定义

有效表达式

除了定义在可逆容器中的表达式外,下面的表达式也必须有效。
名称                         表达式    类型需求                                返回类型
Element access(访问元素)   a[n]      n可以转换成size_type                    如果可变,那么是引用,否则为常量引用

表达式语义

一个表达式的语义只在这个情况下定义,当他在可逆容器中没有定义,或者有额外的信息。
名称                         表达式  前提              语义                   后置
Element access(访问元素)     a[n]    0<=n<a.size()     返回容器的第n个元素

复杂度保证

访问元素的运行时复杂度为缓冲常量时间。

不变量

Element access(访问元素) a[n]返回的元素与增加a.begin()n次得到的结果迭代器解引用是一样的。

模型

vector
deque

注释

参见

Iterator overview,随机访问迭代器,Sequence
posted @ 2012-03-31 13:52 canaan 阅读(1600) | 评论 (0)编辑 收藏
     摘要: 如何设置MFC状态栏?如何在状态栏添加图片?怎样修改状态栏字体颜色?状态栏编程,如何使用状态栏?  阅读全文
posted @ 2012-03-30 22:43 canaan 阅读(3719) | 评论 (0)编辑 收藏

CBitmapButton 类


创建位图图像替代文本标记的按钮控件。


Class CBitmapButton : public CButton


备注


CBitmapButton 对象包含多达四个位图,为按钮的不同状态包含图像:up(or normal),down(or selected),focused,和disabled
。只有第一个位图是必须的;其他都是可以选择的。

位图按钮(Bitmap-button)图像包括图像的边框以及图像本身。边框通常扮演部分显示按钮的状态。例如,focused状态下的位图通

常和up状态下的一样,但是它的边框是矩形虚线或者粗实线。disabled状态下的位图通常类似于up状态但是对比度较低(如暗灰色

或者灰色菜单选择)。

这些位图可以是任意大小,但是对于up状态它们都被视为同样大小。

各种应用要求位图图像的不同组合:

Up Down Focused Disabled 应用
*                                     位图
*   *                                没有WS_TABSTOP样式的按钮
*   *        *           *          带有所有状态的对话框按钮
*   *        *                      带有WS_TABSTOP样式的对话框按钮

当创建一个位图按钮控件,设置BS_OWNERDRAW样式指定按钮为自己绘制的。这使Windows为按钮发送WM_MEASUREITEMWMDRAWITEM

消息。框架为你处理这些消息和管理按钮的外观。

 

在windows客户区域创建位图按钮控件
   1、为按钮创建一到四个位图。
   2、构建CBitmapButton对象。
   3、调用Create函数创建按钮控件,然后附加到CBitmapButton对象上。
   4、当位图按钮构造好后,调用LoadBitmaps成员函数来加载位图资源。

一个对话框中包括一个位图按钮
   1、为按钮创建一到四个位图。
   2、创建一个带有自绘(owner-draw)按钮的对话框模板,按钮放置在你想要的位图按钮的地方。
   3、设置按钮的caption为"MYIMAGE",按钮定义符号为IDC_MYIMAGE
   4、在你应用程序的资源脚本中,在步骤3中为每个为按钮创建的图形设置标题为ID加一个字母,"U","D","F",或者"X"(对应于up,down,focused,和disabled)的字符串。例如,像标题为"MYIMAGE"的按钮,它们的ID为"MYIMAGEU","MYIMAGED","MYIMAGEF",和"MYIMAGEX."你必须指定位图的ID要有双引号。否则资源编译器将制定一个整数的资源,那么MFC在加载图片时就会失败。
   5、在你的应用程序的对话框类(继承自CDialog)中,增加一个CBitmapButton成员对象。
   6、在CDialog对象的OnInitDialog例程中,调用CBitmapButton对象的AutoLoad函数,按钮控件的ID和CDialog对象的指针作为参数。

如果你想处理窗口信息,像BN_CLICKED,位图按钮控件发送给它的父(通常是一个从CDialog派生的类),为CDialog派生对象增加一个消息映射入口,和每个消息处理成员函数。CBitmapButton对象发送的通知跟CButton是一样的。

类CToolBar对位图按钮采用不同的方法。

更多关于CBitmapButton的信息,参考Controls。

要求

头文件:afxext.h

参考

CTLRLTEST sample:Implements Custom Controls
CBitmapButton Members
CButton Class
Hierarchy Chart


原文:

http://msdn.microsoft.com/zh-cn/library/a3y45xs0(v=vs.90).aspx
 

posted @ 2012-03-22 10:36 canaan 阅读(1539) | 评论 (0)编辑 收藏
可逆容器(Reversible Container)

类目:容器


描述

可逆容器是一个有双向迭代器的前向容器。它可以向后向后迭代通过容器。

改善自

Forward Container

相关类型

介绍了两个新的类型。此外,迭代器类型和常量迭代器类型必须满足比前向容器(Forward Container)更严格的要求。迭代器类型和反向迭代器类型必须是双向迭代器(Bidirectional Iterators),而不仅仅是前向迭代器(ForWard Iterators)。

反向迭代器类型(Reverse iterator type)            X::reverse_iterator    一个反向迭代器适配器的基迭代器类型是容器的迭代器类型。递增反向迭代器(rever_iterator)类型对象向后移动通过容器:Reverse Iterator适配器映射了++操作符和--操作符。
常量反向迭代器类型(Const reverse iterator type)  X::const_reverse_iterator  一个反向迭代器适配器的基迭代器是容器的常量迭代器类型。[1]

标记法

X    反向容器模式类型
a,b  类型X对象

定义

有效表达式

除了前向容器(Forward Container)中的表达式外,下面的表达式也必须有效
名称                      表达式     类型要求   返回类型
范围起始Beginning of range a.rbegin()           如果a是可变的,那么是reverse_iterator,否则为const_reverse_iterator[1]
范围结束End of range       a.rend()             如果a是可变的,那么是reverse_iterator,否则为const_reverse_iterator[1]

表达式语义

一个表达式的语义只有在这种情况下定义,当它没有在前向容器(Forward Container)中定义,或者有额外的信息。
名称                      表达式 前提     语义                                后置
逆向范围起始Beginning of range a.rbegin()    相当于X::reverse_iterator(a.end())。 a.rbegin()是提领或者是past-the-end。当a.size() == 0是,它为past-the-end。
逆向范围结束End of reverse range a.rend()    相当于X::reverse_iterator(a.begin())。 a.rend()是past-the-end。

复杂性保证

rbegin()和rend()运行时复杂性是摊销时间为常数。

不变因素

有效范围          [a.rbegin(), a.rend())是一个有效范围。
等待范围          a.begin()到a.end()之间的距离和a.rbegin()到a.rend()之间的距离是一样的。

模型

vector
list
deque

注释

[1]一个容器的迭代器类型和常量迭代器类型有可能是相同的类型:一个容器不需要提供可变的迭代器。因此反向迭代器类型和常量反向迭代器类型也可能是相同的。

参见

Iterator overview, Bidirectional Iterator, Sequence

           
posted @ 2012-03-21 16:07 canaan 阅读(1288) | 评论 (1)编辑 收藏
前向容器(Forward Container)

容器
类目:容器

描述

前向容器中的元素是按一定的顺序排序的:这个顺序不会因为迭代而自动改变。一定的顺序要求允许定义相等的元素(如果容器中的元素是可以比较相等的Equality Comparable)和字典序(如果容器中的元素类型是可以比较小于的 LessThen Comparable)。

前向容器中的迭代器满足前向迭代器的要求:因此,前向容器支持多通道算法,并允许同一个容器可以同时拥有多个激活的迭代器。

完善(Refinement of)

Container,EqualityComparable,LessThanComparable

相关类型

除了容器总定义的,没有其他额外的类型。然而,迭代器类型的要求加强:迭代器类型必须是前向迭代器模式。

标记法

X 是一个前向容器模式的类型
a,b 类型X的对象
T 类型X的值

定义

有效表达式

除了容器中定义的表达式外,EqualityComparable,和LessThanComparable,下面的表达式必须是有效的。
名字                        表达式        类型要求                返回类型
等式(Equality)              a == b        T是EqualityComparable   可转换成bool
不等式(Inequality)          a != b        T是EqualityComparable   可转换成bool
小于(Less)                  a < b         T是LessThanComparable   可转换成bool
大于(Greater)               a > b         T是LessThanComparable   可转换成bool
小于或等于(Less or equal)   a <= b        T是LessThanComparable   可转换成bool
大于或等于(Greater or equal)a >= b        T是LessThanComparable   可转换成bool

表达式语义

一个表达式的语义只有在这种情况下定义,当它没有定义在Container, EqualityComparable, 或者LessThanComparable,或者有额外的信息。
名字                 表达式         前提  语义                                                                         后置
等式(Equality)       a == b               如果a.size() == b.size()而且a中的每个元素都等于b中的对应的元素,那么返回true。否则返回false。
小于(Less)           a < b                相当于lexicographical_compare(a,b)

复杂性担保

等式和不等式的操作与容器的大小呈线性关系。

不变

顺序 两个不同的迭代器迭代一个前向容器的,都是以同样的顺序访问它的元素,提供一个没有干预性的操作。

模型

vector
list
slist
deque
set
hash_set
map
hash_map
multiset
hash_multiset
multimap
hash_multimap

注释

参见

iterator overview, Forward Iterator, Sequence
posted @ 2012-03-19 12:10 canaan 阅读(1115) | 评论 (0)编辑 收藏
仅列出标题
共5页: 1 2 3 4 5