摘要:很多人都应该见过“烫烫烫”这个神一般存在的字符串,一旦“烫烫烫”出现的时候,就说明你玩坏了——指针越界,访问到了非法内存。那么为啥是“烫烫烫”,跟断点有啥关系?INT 3我们在用VC进行调试时,常常会观察到一块刚分配的内存或字符串被填满了“CC”,而0xCCCC正好是“烫”这个汉字的GB2312编码...
阅读全文
随笔分类 - C/C++
摘要:一切都要从这篇文章说起Vim 实在是精致独特得有点像个林妹妹。但谁要是希望家里也有个林妹妹,光把自家丫头照着绣像打扮打扮是不行的,必须从零开始养成一个。而且就算真能养出来个“天上掉下来”一般的可人儿,管家婆的位置仍然没她的份。——《钗黛双收:若你也同Vim难割舍,却又看Emacs情切切》那时候刚工作...
阅读全文
摘要:最近做的项目,需要把代码从VC移植到g++下编译,在这个过程中,遇到了几个平台相关的问题——在VC下顺利编译的代码,但在g++中编译报错。 这里贴出来给大家分享一下: 1. 枚举类型 问题代码 enum MyWeek
{ Monday, Tuesday,
}; MyWeek mw = MyWeek::Monday;
VC
d:\VC\main.cpp(17) : warnin...
阅读全文
摘要:昨天在跟Fiona讨论printf导致程序Crash的问题,就花了点时间看看究竟什么情况下会这样,有兴趣的童鞋可以看看:) 只要是玩过C或者C++的童鞋们,对printf肯定是再熟悉不过了。下面有几个方法,你知道每个方法输出是什么吗? void Test1(){ printf("hello %d");}void Test2(){ printf("hello %s");}void Te...
阅读全文
摘要:在博客园看到一份面试题,觉得挺有意思,现在贴出来,并整理了一份答案。原帖地址:http://www.cnblogs.com/feihe0755/p/3644295.htmlextern "C"的作用?extern "C" 修饰的变量和函数是按照C语言方式编译和连接的。#pragma once方式和#...
阅读全文
摘要:话说玩C++的,都肯定知道面向对象的多态性。而要搞清楚多态,又不得不接触虚表(Virtual Table)。 虚表的结构 虚表的结构很简单,就是单纯的虚函数指针数组,没有别的条目。 看一个例子,有如下代码: class IUnknown{public: virtual long AddRef() = 0; virtual long Release() = 0;private:};cl...
阅读全文
摘要:基于C++模板编程,我们可以将一部分计算放到编译期来完成,还能够给编写代码带来很多方便。比如题目中提到的,利用C++模板技术求各整数类型的最大最小值。代码如下:// indicates T is signed or unsignedtemplate< typename T > struct TFSigned{ enum { fSigned = T(-1) < 0 };}; // represents the bit length of Ttemplate< typename T > struct TBitCount{ enum { cBits = sizeof(
阅读全文
摘要:This two call convention puzzels me since I knew them. MSDN explanations as below: _stdcall The __stdcall calling convention is used to call Win32 API functions. The callee cleans the stack. _cdecl ...
阅读全文
摘要:先贴出自己写的测试代码:int* M2(int* p){ return p+1;}int M(int a, char b){ int* pp = M2(&a); return *pp;}int _tmain(int argc, _TCHAR* argv[]){ int e=0; int d = M(3,'c'); getchar(); return 0;}然后来一层一层的分析:调用函数Main008B1030 push ebp // 将ebp的值压入栈 008B1031 mov ebp,esp // 将esp的值赋值给ebp008B1033 sub ...
阅读全文
摘要:.NET下的很多技术都是基于反射机制来实现的,反射让.NET平台下的语言变得得心应手。最简单的,比如枚举类型,我们我可以很容易的获得一个枚举变量的数值以及其名称字符串。可是,在C++中,枚举变量本质上和一个整形变量没有区别,我们很难获取一个枚举变量的名称字符串。其实在C++中,我们可以通过宏来实现类似反射的机制。接下来,我想总结一下如何在C++中实现一个类似于C#枚举类型的方法。 __VA_ARGS__使用__VA_ARGS__,我们可以定义带可变参数的宏,举个例子:#define MY_PRINTF(…) printf(__VA_ARGS__)这样我们写MY_PRINTF("hel
阅读全文
摘要:这个问题曾经在教科书上见到过,没想到自己居然遇到了。前几天到客户那去维护程序,出现了大致如下的一段CPP代码。 int resultValue =0; if (some condition) { /* other codes */ int resultValue = /* some value */ } else { /* other codes */ int resultValue = /* some value */ } /* use resultValue */当时代码一跑...
阅读全文
摘要:最近在工作当做遇到一个问题,需要统计一段代码执行时间,但是手头上却没有一个好用的计算时间间隔的东西。于是,自己山寨了一把.NET下的StopWatch类,写了一个C++下的DNetStopWatch类。类图如下:代码逻辑几乎完全按照StopWatch类来实现的。以下是一段测试代码: DNetStopWatch sw; sw.Start(); Sleep(1000); sw.Stop(); sw.Start(); Sleep(3000); sw.Stop(); printf("Elapsed Ticks: %lld,\tElapsedMilliseconds: %lld",s
阅读全文
摘要:关于C++动态库导出API相关的这几个关键字,一直困扰了许久,每次在调用C++动态库接口函数的时候,我都不得不花一些时间去“试”。但是用过之后就忘了……首先解释一下 _cdecl 和 __stdcall所代表的意义:Cdecl:调用方清理堆栈。这使您能够调用具有 varargs 的函数(如 Printf),使之可用于接受可变数目的参数的方法;StdCall:被调用方清理堆栈。这是使用平台 invoke 调用非托管函数的默认约定。我花了一些时间专门对以上这个关键字做了一些测试。结果如下(没有使用def文件):API函数声明:__declspec(dllexport) void MyMethod(
阅读全文

浙公网安备 33010602011771号