C与C++
文章平均质量分 69
soloist
这个作者很懒,什么都没留下…
展开
-
MFC中打印预览的若干问题
MFC提供了一个框架性的打印和打印预览功能代码,它的基本思想是将实际显示和打印文档的代码合二为一,即都由此文档关联的CView中的OnDraw(CDC *pDC)来处理,由MFC框架根据用户的操作来决定传进来的pDC是指向屏幕还是打印机,当pDC指向屏幕设备,就在屏幕上显示文档,当指向打印机设备时就打印文档。这些都很好理解,但是,当我们要打印预览时,传进来的pDC就有些特别了。因为打印预原创 2004-03-21 17:34:00 · 2607 阅读 · 0 评论 -
为什么会出现LNK2005"符号已定义"的链接错误?
许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。 大家都知道,从原创 2005-09-30 21:11:00 · 22606 阅读 · 12 评论 -
在VC6.0中如何让new操作失败后抛出异常?
标准C++规定new一个对象时如果分配内存失败就应抛出一个std::bad_alloc异常,如果不希望抛出异常而仅仅传回一个NULL指针,可以用new的无异常版本:new(nothrow)。 VC6.0在头文件中声明了这两种operator new操作符:void *__cdecl operator new(size_t) _THROW1(std::bad_alloc);void *原创 2005-10-11 23:14:00 · 4154 阅读 · 1 评论 -
2005年C++软件技术大会第一天
今天是C++软件技术大会的第一天,上午的主讲人是Bjarne Stroustrup,topic是关于C++新标准C++0X制订的一些情况。Bjarne用了4个词来描述标准制订的过程: 正式(formal)、缓慢(slow)、官僚主义(bureaucratic)、民主(democratic)。另外,那个X预计是9,所以如果进度正常的话下一代标准应该是2009年推出。 下午由科泰世纪的陈原创 2005-11-20 00:34:00 · 7059 阅读 · 8 评论 -
雅虎招聘考试中两道C++题目的疑问
昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题://int I = 2;int x = (++I) + (++I) + (++I);//int I = 2;int x = (I++) + (I++) + (I++);问分别执行两段代码后,x的值是多少? 在这里我不想去辛苦地求解,因为我认为这两道题是有问题的。为什么? ANSI C标准告诉我们,如原创 2005-11-15 17:23:00 · 12442 阅读 · 75 评论 -
gcc的一个小bug
在C语言里有一个通用指针,即void*类型指针。通用指针有一条特殊的性质:任何一个指向某种类型(非函数类型)数据的指针转型为通用指针后再转换回原始类型,指针(的值)不会改变。换句话说,任何非函数类型的指针与通用指针间的互相转型(以及赋值)是(语法上)合法且(语义上)安全的。 通用型指针实际是一种类型未知的指针,因此不能对它解引用(dereference)和施行下标(subscri原创 2006-03-31 22:37:00 · 3222 阅读 · 5 评论 -
vc如何返回函数结果及压栈参数
首先说明,本文的分析对象是运行在IA32平台上的程序,试验用的编译器是Visual C++ 6.0中的cl.exe(Microsoft 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86)。 IA32程序利用程序堆栈来支持过程(procedure)调用,比如创建局部数据、传递参数、保存返回值信息、保存待今后恢原创 2006-09-22 19:14:00 · 5192 阅读 · 6 评论 -
bjam,别弄乱了链接顺序!
公司目前用bjam做build工具。bjam为boost项目所采用,对构建常规的C/C++工程比较方便,但是限制也很多,尤其是内建的脚本语言太晦涩,使得定制自己的构建规则很不方便。不过今天我想说的倒不是这些缺点,而是bjam 3.1.13在FreeBSD平台上的一个bug。 我们有3个文件,分别是 main.c :#include void foo_one(int);in原创 2007-02-08 21:43:00 · 7363 阅读 · 2 评论 -
探索一种C++二进制模块的热更新机制
现如今,提供稳定可靠且能满足人民群众日益增长的物质文化需要的服务是互联网服务商的基本责任,所以服务端软件一定要够壮够强够灵活。服务程序一旦跑起来那就最好7X24小时地永远别挂,而且多变的、不停增长的用户需求也得尽快满足。可问题是,永远也别指望程序员写出没有bug的程序,任何架构师也没有水晶球可以预测将来的花花世界,无论当时看起来多么完美的代码,将来也会因为种种原因要被修改(或者被丢弃?)。原创 2008-06-23 21:39:00 · 17920 阅读 · 8 评论 -
恶斗TCC(Tiny C Compiler)
TCC,全称Tiny C Compiler(http://bellard.org/tcc/),是一个颇具特色的C编译器,你能把它当作一个C语言解释器来用,也可以嵌入你自己的应用程序作一个动态代码生成器。是的,我们就是这么干的。在我们的项目中,粒子系统的运动规则用C语言来描述,然后由TCC动态生成native code运行。这么做既不失效率又保持了较高的动态能力。 但是,原创 2009-07-12 17:35:00 · 24191 阅读 · 19 评论 -
ANSI C中取得结构体字段偏移值的惯用法
假设在ANSI C程序中定义了一个名为MyStruct的结构类型,其中有一个名为MyField的字段,如何取得它在结构体中的偏移?typedef struct MyStruct_tag{ // some fields ... long MyField; // other fields ...} MyStruct; 最容易想到的方法应该与如下代码差不多:s原创 2005-01-18 22:59:00 · 5017 阅读 · 1 评论 -
内存对齐与ANSI C中struct型数据的内存布局
当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段原创 2004-12-12 14:43:00 · 8085 阅读 · 11 评论 -
拨开自定义operator new与operator delete的迷雾
C++允许用户通过自定义operator new和operator delete的方式来更改new与delete表达式的某些行为,这给了程序员定制内存管理方案的自由。但是享受这种自由的时候必须遵守一定的规范,具体可以参见《Effective C++ 2nd》的相关条款。本文补充解释一些特别容易引起误解的问题。 operator new和operator delete都有其正规形式原创 2004-11-23 19:36:00 · 3177 阅读 · 0 评论 -
模板参数推导
看下面一段代码: template struct FuncPtrTraits { typedef ReturnValue_t (*Type)(int,int); }; template void MakeFuncPtr(typename FuncPtrTraits::Type arg1) { //do s原创 2004-10-25 20:35:00 · 3208 阅读 · 4 评论 -
关于内存分配与释放的试验
在VC里头,用new创建一个对象或者分配一块内存的话,如果操作失败并不会抛出一个异常,而只是返回一个NULL指针。 有如下代码: delete p; //p是一个合法的指针 delete p; 这段代码在VC的debug版本中会在运行第二行时给出警告,因为此时p指针指向的已不是一个合法的被分配内存区了,delete原创 2004-10-25 20:20:00 · 1986 阅读 · 2 评论 -
MFC中菜单项的动态添加、删除与响应
在编写游戏地图编辑器时涉及到菜单项的动态添加和动态响应,本文记录了碰到的一些问题和解决方法。 因为游戏地图是分层次存储和显示的,所以在编辑器主菜单中有个Layer菜单,这个菜单中的菜单项除了一个"Show Only"菜单项和一个Sperator,其它的菜单项是根据地图中的层数和层的名字动态添加的,所以在编译期无法知道菜单项的个数,也无法用ON_COMMAND宏将这些菜单项与命令处理函原创 2004-10-28 22:40:00 · 7901 阅读 · 1 评论 -
C++继承体系中名字遮挡问题
C++中派生类函数遮挡(Hide)基类中同名函数的问题是比较令人费解的,有必要详细说明一下。 看看下面一段代码: class Base { public: virtual void f(int x) {}; }; class Derived : public Base { public: virtua原创 2004-10-25 20:29:00 · 1847 阅读 · 3 评论 -
C标准库函数abs的一个错误
VC.NET 7.1 提供的取绝对值函数(abs.c中)如下: int __cdecl abs ( int number ) { return( number>=0 ? number : -number ); } 此函数实现得非常简单,乍看之下无任何毛病,可是仔细琢磨琢磨,就发现了一个大漏洞。举个极端的例子,当函数参数为INT原创 2004-10-26 18:00:00 · 8564 阅读 · 7 评论 -
C/C++中数组名的含义
C/C++中的数组名是个很奇怪的东西,它到底代表什么呢? 对于char array[n](n是一个常数),大概有这么几种语义: char* const(注意不是const char*) char [n] 举例如下(WIN2000 PRO平台,VC.NET 7.1下编译): char *p = array; //array表示char* const,p得到的原创 2004-11-03 01:29:00 · 5022 阅读 · 5 评论 -
我看C++/CLI和.NET
最近C++/CLI成了国内程序员关注的焦点,原因是它的开发人之一Stan Lippman来中国开技术大会并全力推介它,而且《程序员》杂志刊登了孟岩老兄对此人的专访,于是软件界一时群情激昂、人声鼎沸,各种说法也是不绝于耳。此专访的节选被放在孟岩自己的BLOG上,后头跟贴相当多(恐怕有上百条),不少人流露出对C++/CLI的反感甚至鄙夷,更有过火者对Stan Lippman本人也是大肆挞伐,说原创 2004-11-12 13:55:00 · 2710 阅读 · 6 评论 -
整型表达式比较的潜在危险
在程序里头经常会用到整数之间的大小比较,但是其中潜在的危险却往往被忽略了。例如一个内存拷贝函数:void memcpy(void *pTo,void *pFrom,size_t size){ assert(pTo != NULL && pFrom != NULL); while( --size >= 0) { *pTo++ = *pFrom++; }}原创 2004-11-09 20:36:00 · 2903 阅读 · 1 评论 -
学到的一个宏技巧
最近看到孟岩的一篇文章介绍了一个C语言的宏定义技巧,觉得颇有价值。宏定义如下:#define RETURN switch(Exception_stack = / Exception_stack->prev,0) default: return 看得出这是定义了一个实现C中return功能的宏RETURN,但它保证了在return之前一定会执行Exception_stack =原创 2004-11-13 21:12:00 · 4015 阅读 · 9 评论 -
Visual C++对虚函数重载的诡异布局
毫不令人惊讶的是,C++又给了我一个惊讶! 对于被重载的虚函数(overloaded virtual member functions),Visual C++ 并不会依照它们声明的顺序排布在虚表中。 一组(同名的)重载虚函数会按照它们声明的逆序依次排布在一起,而组与组之间的顺序,是由组内最先出现的那个函数声明的位置决定的,越先声明,该组越靠前。原创 2010-05-27 19:27:00 · 6356 阅读 · 0 评论