C/C++
文章平均质量分 59
skywalker_leo
hello
展开
-
C语言运算符优先级 之 快速记忆
优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右()圆括号(表达式)/函数名(形参表).成员选择(对象)对象.成员名->成员选择(指针)对象指针->成员名2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式++自增运算符++变量名/变量名++单目运算符--自减运算符--变量名/变量名--单目运算符*取值运算符*指针变量单目运算符&原创 2011-03-10 13:59:00 · 17636 阅读 · 5 评论 -
C程序中常见的与存储器有关的错误
[转自:《深入理解计算机系统》,Randal E.Bryant & David O' Hallaron]10.11 C程序中常见的与存储器有关的错误 对C程序员来说,管理和使用虚拟存储器可能是个困难的、容易出错的任务。与存储器有关的错误属于那些最令人惊恐的错误,因为它们经常在时间和空间上,都在距错误源一段距离之后,才表现出来。将错误的数据编写到错误的位置,你的程序可能在最终转载 2013-02-01 17:50:56 · 1374 阅读 · 0 评论 -
在连接中EOF意味什么?
EOF的概念常常使大家迷惑,尤其是在因特网连接的上下文中。首先,我们需要理解其实并没有像EOF字符这样的一个东西,进一步来说,EOF是由内核检测到的一种条件。应用程序在它接收到一个由read函数返回的零返回码时,它就会发现出EOF条件。对于磁盘文件,当前文件位置超出文件长度时,会发生EOF。对于因特网连接,当一个进程关闭连接在它的那一端时,会发生EOF。连接另一端的进程在试图读取流中最后一个字节之转载 2013-03-11 09:47:53 · 3784 阅读 · 0 评论 -
uClinux下应用程序获取USB键值
[ 注:内核代码中Documentation/input/input.txt,有输入设备的介绍。]系统检测到USB键盘后,一般会将其映射到/dev/input/event0,可能使用cat命令进行确认: #cat /dev/input/event0操作USB键盘时会有乱码出现。也可以用以下命令查看设备与节点的关联: #cat /proc/bus/inpu原创 2013-04-03 15:19:51 · 1258 阅读 · 0 评论 -
关于MFC CEdit中仅输入数字时,如何使其不能输入以0开头的非0整数
在MFC中使用CEdit时,设置只允许输入数字,但仍然会出现下图所示“数字200前允许输入0”的问题。这种情况被认为是用户界面不友好的表现,需要做成:如果已经输入非零整数200,则不允许在200再输入0,如下图。可以通过以下方法实现:1. 在DoDataExchange函数中为CEdit控制映射整型变量:DDX_Text(pDX, IDC_EDIT_RXDELAY,原创 2014-09-10 11:25:32 · 3301 阅读 · 0 评论 -
函数调用规范
当高级语言函数被编译成机器码时,有一个问题就必须解决:CPU没有办法知道一个函数调用需要多少个、什么样的参数(即计算机不知道怎么给这个函数传递参数),传递参数的工作必须由函数调用者和函数本身来协调。为此,计算机提供了一种被称为栈的数据结构来支持参数传递。 函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,由调用者(Ca转载 2015-03-05 12:01:10 · 760 阅读 · 0 评论 -
关于VS中静态调用dll的一些问题
在静态调用dll时,只需要在代码中加入#pragma comment(lib, "E:\\test.lib")就可以正确编译,而只有程序运行时才会载入相应的test.dll。为了方便调试,通常希望直接调用Debug目录下的库文件,如E:\test\debug,以便于在库函数调用时可单步调试。#pragma comment(lib, "E:\\test\\debug\\tes原创 2015-05-08 16:32:49 · 3364 阅读 · 0 评论 -
C++:overload, override和overwrite
Overload(重载):在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数或返回值不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。Override(覆盖):是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相转载 2015-08-07 11:24:10 · 625 阅读 · 0 评论 -
C++:公有继承、私有继承和保护继承
在C++中有三种继承方式:公有继承(public)、私有继承(private)和保护继承(protected)。1. 公有继承(public)公有继承:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。2. 私有继承(private)私有继承:基类的公有成员和保护成员都作为派生类的私有成员,并且转载 2015-07-09 11:25:41 · 1209 阅读 · 0 评论 -
关于C++两个类相互引用的一点思考
昨天跟朋友讨论了一下在C++中如果出现两个类相互引用的情况,编译无法通过的问题如何解决:// A.h#ifndef A_H#define A_H#include "B.h"class A{ B b;};#endif A_H// B.h#ifndef B_H#define B_H#include "B.h"class B{ A a原创 2015-09-01 10:40:46 · 2372 阅读 · 0 评论 -
构造函数为什么不能是虚函数?
1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身转载 2015-08-07 07:47:36 · 625 阅读 · 0 评论 -
C++智能指针详解
一、简介 由于C++语言没有自动内存回收机制,程序员每次new出来的内在都要手动delete。程序员忘记delete;流程太复杂导致没有delete;异常导致程序过早退出,没有执行delete的情况并不罕见。 用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、boost::s转载 2015-09-09 17:55:00 · 632 阅读 · 0 评论 -
Linux异步I/O
Linux中最常用的输入/输出(I/O)模型是同步I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待I/O请求完成时不需要占用任何CPU时间。但是在某些情况中,I/O请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步I/O(AIO)应用程序接口(API)就提供了这种功能。在本文中,我们将对这个API概要进行介绍转载 2015-09-05 11:06:43 · 903 阅读 · 0 评论 -
关于const int*, int const*以及int *const的区别
使用C++也有些年了,这个语言确实有诸多繁琐和变态的地方,比如这次要说明的const int*、int const*以及int *const的区别就是一例。相信不少同学都会对这其中的差异表示不解,我尝试着用一段代码来对他们进行区别。 先用上一篇文章中提到的助记方法(从变量名开始从右往左读)来理解一下这三者的字面意思: const int* ip; // i原创 2015-09-21 17:01:52 · 25645 阅读 · 0 评论 -
关于const与指针混合使用的助记法
助记方法:把一个声明从右向左读比如:1. char * const cp; //cp is a const pointer to char2. const char * cp; //cp is a pointer to const char; 规则:¨ 声明从右到左读:¨ * 读成 pointer to¨ ** 读成 (转载 2015-09-21 15:42:51 · 959 阅读 · 0 评论 -
指针引用
在C语言中,如果想改变指针本身而不是这所指向的内容,函数声明可能像这样:void f(int **);当传递它时,必须取得指针的地址:int i = 47;int *ip = &i;f(&ip);当需要向一个buffer中不断的增加内容,需要改变buffer的地址。比如说,要分析一个文件,将文件中所有以s开头的单词都加入到这个buffer中,然后我们在分析文件之前,并不清楚多大的buf原创 2013-01-06 10:39:03 · 674 阅读 · 0 评论 -
虚函数的性质
虚函数的性质[转自《深入浅出MFC》,侯俊杰]如果你期望派生类重新定义一个成员函数,那么你应该在基类中把此函数设为virtual。以单一指令调用不同函数,这种性质称为Polymorphism,意思是“the ability to assume many forms”,也就是多态。虚拟函数是C++语言的Polymorphism性质以及动态绑定的关键。既然抽象类中的虚函数不打算被调用,我们就不转载 2012-12-18 09:32:47 · 1013 阅读 · 0 评论 -
C++引用与指针的区别
[转载自:http://blog.csdn.net/thisispan/article/details/7456169]★ 相同点: 都是地址的概念;指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。★ 区别: 1. 指针是一个实体,而引用仅是个别名; 2. 引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一转载 2012-12-15 11:03:26 · 615 阅读 · 0 评论 -
C/C++语言void及void指针深层探索
<br />C/C++语言void及void指针深层探索<br /><br />作者:宋宝华1 概述<br />许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法和技巧。2 void的含义<br />void的字面意思是“无类型”,void *则为“无类型指针”,void *能指向所有类型的数据转载 2011-03-11 10:00:00 · 1286 阅读 · 0 评论 -
宽字节与单字节的转换 Unicode字符集下CString与char *转换
<br />[注:抱歉未能找到文章原始出处,见谅!] <br /> <br /> 在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *转载 2011-03-30 15:28:00 · 880 阅读 · 0 评论 -
VC基于对话框的程序中,按ESC键窗口不关闭
<br />Overide the function PreTranslateMessage like this:<br /><br /><br /><br />BOOL CDlgMain::PreTranslateMessage(MSG* pMsg)<br />{<br /> switch(pMsg->message)<br /> {<br /> case WM_KEYDOWN: <br /> {<br /> switc原创 2011-04-15 09:13:00 · 1980 阅读 · 0 评论 -
#define VS typedef
<br /><br />#define VStypedef<br />1. #define是预处理指令,是宏定义语句。在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,例如:<br />#define PI 3.1415926<br />程序中的:area=PI*r*r 会替换为3.1415926*r*r,如原创 2011-04-15 09:46:00 · 653 阅读 · 0 评论 -
VC++中播放声音的方法
声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC++中可以根据不同的应用要求,用不同的方法实现声音的播放。一、 播放声音文件的简单方法在VC++中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound, UINT fuSound ); 或BOOL PlaySound ( LPCSTR lpszSound,转载 2011-04-29 10:25:00 · 1441 阅读 · 0 评论 -
VS2005下MFC调用Windows Media Player小结
<br />方法一<br />1. 安装WMP9<br />2. VS2005创建mfc工程,名称如MP。<br />在资源视图中,右键“Insert activex control...”,添加Windows MediaPlayer控件。右击控件“Add variable...”,指定变量名m_player。这时,你会发现工程中添加了两个文件,分别为:ocx1.h和ocx1.cpp文件。这时发现ocx1.h文件中只有变量的设定,而并没有对应的方法,并且在MPDlg.转载 2011-04-29 15:30:00 · 3878 阅读 · 0 评论 -
MFC中使文档对话框最大化显示的方法
我在创建基于文档对话框的工程时,没有勾选“默认最大化”显示,但实际工作中需要做到这一点。昨天在搜索了半天相关的方法,现总结如下:方法一:重载CMainFrame的ActivateFrame函数,加入代码nCmdShow = SW_SHOWMAXIMIZED; void CMainFrame::ActivateFrame(int nCmdShow)原创 2012-09-07 09:18:09 · 1945 阅读 · 0 评论 -
文档对话框程序启动时默认打开文件
BOOL CCMyGOApp::InitInstance(){ …… // 分析标准外壳命令、DDE、打开文件操作的命令行 CCommandLineInfo cmdInfo; cmdInfo.m_nShellCommand = CCommandLineInfo::FileOpen; cmdInfo.m_strFileNam原创 2012-09-11 10:04:20 · 564 阅读 · 0 评论 -
Windows音频编程:Win32 Wave API 的使用
[转自:http://blog.csdn.net/zhi_qiu_yi_ye/article/details/6663366] 使用 Wave API 进行Windows音频编程可以保持很大的自由度,而且与Linux中的OSS编程模式很像。下面我简单介绍函数的调用顺序,具体的用法参见MSDN(VS2008)。 录音: waveInOpen -> waveI转载 2012-10-26 11:14:50 · 4703 阅读 · 0 评论 -
回调函数调用类成员函数的方法
利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从而实现程序函数可转载 2012-10-26 15:55:48 · 2190 阅读 · 0 评论 -
自定义MFC打开/保存对话框的扩展名
“打开文件”对话框这里的顶目名称是D-TriNet,文档扩展名是.dtn和.csv。 要让打开/保存对话框支持多个扩展名,最简单的方法是修改资源文件中的IDR_DTriNetTYPE字段: STRINGTABLE BEGIN IDR_MAINFRAME "D-TriNet" IDR_DTriNetTYPE "\nDTriNet\转载 2012-10-25 16:54:08 · 2481 阅读 · 0 评论 -
waveOutReset锁死问题
今天想利用waveOutReset实现停止放音的功能,但是之前只要此函数经调用就会出现死锁,上网找了一大堆资料都没能解决这个问题。后面发现在回调函数中不能有wave函数(如waveOutClose...)的相关操作,否则会导致死锁,具体原因不明。void CSoundBase::OnWOM_DONE(WPARAM wParam, LPARAM lParam){ // 回调函数waveOu原创 2012-10-26 16:09:30 · 2227 阅读 · 0 评论 -
MFC工具栏按钮下拉
1. 首先在CMainFrame::OnCreate 函数下添加如下代码,让工具栏有下拉能力和向下的箭头按钮; // 让工具栏具有处理下拉箭头的能力 DWORD dwExStyle = TBSTYLE_EX_DRAWDDARROWS; m_wndToolBar.GetToolBarCtrl().SendMessage(TB_SETEXTENDEDSTYLE, 0, (L转载 2012-11-20 10:28:35 · 3177 阅读 · 1 评论 -
VC6.0转VS2005问题及解决办法
该文主要内容转载自:http://www.cnblogs.com/sunliming/archive/2011/05/08/2040152.html。我对原文的内容加以整理,便于阅读,以后发现新的转换问题,将会继续补充,也欢迎大家跟帖提出新的问题并解决办法,帮助我继续完善,谢谢!一. 函数原型改变导致的问题1. errorC2440:CMainFrame 无法从 NMTO原创 2012-10-23 15:41:02 · 3737 阅读 · 0 评论 -
C语言中的复杂声明和定义,以及如何使用typedef进行简化
在阅读Linux的内核代码是经常会遇到一些复杂的声明和定义,诸如: (1) void * (* (*fp1) (int)) [10]; (2) float (* (*fp2) (int, int, float)) (int); (3) typedef double (* (* (*fp3) ()) [10] ();原创 2015-09-21 10:12:16 · 7405 阅读 · 6 评论