
C++/C
ani_di
喜欢收集有趣的面试题;python程序员。
展开
-
64位整数格式化小技巧
我做的项目经常是需要跨平台的(Windows+MacOS),不过这两个平台上printf 的64位整数的Type Filed Charactors不一样,确切的说是mscrt与glibc不一样,前者是‘I64’,后者是‘ll’。以前的解决方法是通过宏来控制#ifdef __GUNC__ printf("%lld", i);#else printf("%I64d", i原创 2011-06-20 12:31:00 · 5065 阅读 · 0 评论 -
A Quiz About Integers in C
本文根据 http://blog.regehr.org/ A Quiz About Integers in C 整理而成Q1:表达式 1 > 0 的值是?A)0B)1C)undefinedA1: B。这是热身运动Q2:表达式 1U > -1 的值是?A)0B)1C)undefinedA2:A。无符号与有符号比较时,有符号的会转换为无符号。翻译 2012-06-05 20:37:41 · 833 阅读 · 0 评论 -
趣题 do while continue
下面的代码输出时多少?main(){ int i = 0; do { i++; if ( i < 3) continue; } while(0); printf("%d\n", i);}答案:1很多人认为,continue语句是跳转到循环的起始位置重新开始。但是,对于do ...原创 2012-06-06 17:43:15 · 1351 阅读 · 0 评论 -
Release版本的调试
截取自《游戏之旅——我的编程感悟》P311, 作者:云风PS:最近在项目中正好遇到一个release版本在测试部门崩溃了,正好拿来练手。由于是第一次,折腾了一个多小时才定位到问题。这里去把一些心得写下来。1、崩溃时,windows会弹出一个对话框,告诉你哪个地址发生了什么样的错误。通常这还不够,dump文件更有用。dump文件生成的方法有很多,可以用代码,xp下有Dr.Watson原创 2012-05-27 23:42:30 · 1978 阅读 · 0 评论 -
未加载ntdll.dll符号导致调用栈信息丢失
近日,在调试某一dump文件时,指定并load了自己dll的pdb文件,但是仍然没能看到相应的调用栈信息。崩溃线程显示的调用栈如下 ntdll.dll的符号没有找到,但为什么它要中间隔开,后面又显示ntdll.dll?当时没有在意,偶然间,在另一台机器通过windbg调试,没想到显示了完整的调用栈,逐怀疑就ntdll.dll的符号引起的,因为windbg有自动连接到微软的符号原创 2012-06-26 17:19:12 · 12430 阅读 · 3 评论 -
一道迅雷笔试题引发的思考?—— 不重复随机算法
csdn上看到的一帖子 http://topic.youkuaiyun.com/u/20120825/20/6171393d-15ea-4a50-ba30-78d1d24974e3.html,是关于一种不重复随机算法,可以计算0 ~ n中不重复的m个数。#include #include using namespace std;void knuth(int n, int m){ sr原创 2012-08-30 16:57:33 · 1312 阅读 · 0 评论 -
让gcc和gdb支持intel格式的汇编
默认情况时,gdb和gcc输出的汇编都是AT&T格式的,但是它们都有方式来转换为Intel格式。gcc -S -masm=intel test.cgdb则是设置环境变量set disassembly-flavor intelgas事实上也支持Intel格式,只是用得比较少。AT&T和Intel差别本身就不大,只是大家在windows上弄久了后,可能有特别偏好。原创 2012-08-22 00:35:37 · 5320 阅读 · 0 评论 -
Modern C++ Design 繁体版勘误1
P34template class NiftyContainer{ ... typedef Select::Resault ValueType; ...};这段代码在编译时会出现下面警告,并且ValueType缺少类型说明符错误warning C4346: “Select::Resault" 依赖名称不是类型正确的写法是template原创 2012-09-02 14:54:16 · 820 阅读 · 0 评论 -
Lock-Free Code: A False Sense of Security
By Herb Sutter, September 08, 2008Given that lock-based synchronization has serious problems [1], it can be tempting to think lock-free code must be the answer. Sometimes that is true. In partic转载 2012-09-08 16:44:35 · 1304 阅读 · 0 评论 -
Writing Lock-Free Code: A Corrected Queue
By Herb Sutter, September 29, 2008As we saw last month [1], lock-free coding is hard even for experts. There, I dissected a published lock-free queue implementation [2] and examined why the code转载 2012-09-08 17:04:46 · 1360 阅读 · 0 评论 -
你以为你真的会计算进度吗?
现有一需求,计算拷贝文件的进度。假设已知文件总大小t字节,已拷贝了n字节。对于如此简单的需求,大多数人会第一时间这样实现int progress(int t, int n) { //已完成除以总大小 return n/t*100; }很抱歉,这样实现你将发现它会只有两个值——0和100。原因是,当一个整数除以另一整数,如果小于0,则 向下取整为0,0*100自然原创 2013-02-18 21:50:44 · 1050 阅读 · 0 评论 -
SendMessage 和 PostMessage 的区别
今日被问起SendMessage和PostMessage的区别,Win32 api的东西已经忘得差不多,但是网上一定能搜出来。http://hi.baidu.com/umu618/item/3cf984ffcff56bee1b111f05SendMessage 和 PostMessage 的区别1、首先是返回值意义的区别,我们先看一下 MSD转载 2013-02-20 20:12:58 · 710 阅读 · 0 评论 -
一个使用STL::string时遇到的诡异bug
事情大致是这样的: 代码中用到一个局部string对象. 异常的是, 我还没给他赋值, 它的c_str()中已经有一些数据了.下面的代码模拟了这种情况#include #include using namespace std;void test(){ string s; memset((char*)s.c_str(), 'a', 10);}int原创 2013-03-05 16:58:16 · 1218 阅读 · 2 评论 -
程序员面试题:How to reverse a list
Q: implement a function that give a list head as a arg, and return another list head which the list reversed. // annidy@gmail.com#include #include typedef struct _Node{ struct _Node* nex原创 2011-06-12 18:12:00 · 796 阅读 · 0 评论 -
从dll构建lib
作者:ani_di 版权所有,转载务必保留此链接 http://blog.youkuaiyun.com/ani_di从dll构建lib利用lib来静态调用dll比传统的LoadLibrary要方便很多。有时候只有dll没有lib,但是我们还是有方法生成,下面是我的经验。(命令行操作,先自行进入VS的命令行工具)Step 1. 头文件如果有头文件请跳过。原创 2013-04-17 19:27:07 · 1436 阅读 · 0 评论 -
预处理器简介
预处理器 预处理是C编译器做的第一件事情,主要是做一些文本方面的工作。包括:删除注释、插入被#include包含的文件、定义和替换由#define指令定义的符号以及代码的部份内容,和条件编译。预定义符号 预定义符号如下表所示:__FILE__进行编译的文件名__LINE__文件的当前行号原创 2012-03-20 13:21:21 · 770 阅读 · 0 评论 -
让 win32 程序也可以从 console 输出信息
平日里写的代码都是用控制台自测, 然后封装成dll给界面用. 开始比较懒,没有用到日志,直接用printf代替的. win32程序调用后就看不到printf的输出,比较郁闷.后来看到风云的一篇文章 http://blog.codingnow.com/2007/01/win32_console.html . 发现原来win32也可以用重定向. 简单的说,假设test.exe就win32程序,原创 2012-05-25 18:48:55 · 1091 阅读 · 0 评论 -
预处理器
曾经写过一篇关于C预处理器的文章,不过今日偶遇一很有意思的宏 #define MAX(x, y) ({ / __typeof__(x) my_localx = (x); / __typeof__(y) my_localy = (y); / my_localx > my_localy ? my_localx : my_localy原创 2011-06-24 00:20:00 · 585 阅读 · 0 评论 -
C++中的地雷
据说这里C++中的经典示例#include using namespace std; void a(){ volatile int array[10]; for (int i = 0; i < 10; i++) array[i] = i;}void b(){ int array[10]; for (int i = 0; i < 10;原创 2011-07-02 12:33:49 · 1237 阅读 · 0 评论 -
glibc的wchar_t问题
glibc对wchar_t的处理确实会带来不少陷阱,因为它既可能是16位,又可能是32位。在mac上,默认情况下是32位的,而cocoa里UniChar是16位的。另外,还有一些打印函数的格式化也受到影响。比如swprintf。在windows上,宽字符串和窄客串格式化符都是%s。而glibc在wchar_t是16位是工作正常,到32位是则只处理了每一个字符!原因是它仍然按16位处理,而后原创 2011-11-23 21:09:59 · 864 阅读 · 0 评论 -
Effective C++ 笔记
条款1:尽量以const和inline取代#define 另一个关于define的缺陷是,define定义的符号可能没有机会编译进来或者在其它头文件中有一个相同的符号,结果被覆盖了。至于inline,通常与templete联用。条款2:尽量以取代 老式输出流方式应该扔掉了,别忘了二级考试scanf吃的大亏。一个例外是strstream,它有原创 2011-12-08 15:29:57 · 676 阅读 · 0 评论 -
几个值得一用的boost库
boost是一个由很多其它库组成的集合,它跨平台,并且在各种编译器上都表现不错。更为重要的是,这些库的作者与C++标准委员会有密切的联系,说不定那一天就成为标准库的一部分,这样一来,学习它的投资成效会大很多。目前,boost已经有相当数量的库存在了,大的有像gil这种特定领域的库,小的有像array这种工具库,全部学完是需要很多时间成本的。不过,实际环境中大不不必为使用boost而使用boost。原创 2011-12-13 17:52:44 · 3814 阅读 · 0 评论 -
生成随机的GUID的C代码
随手写的,生成几个GUID有用,大规模用就不好说了。/* annidy@gmail.com */const char* newGUID(){ srand(time(NULL)); static char buf[64] = {0}; snprintf(buf, sizeof(buf) , "{%08X-%04X-%04X-%04X-%04X原创 2011-12-28 18:06:08 · 5691 阅读 · 0 评论 -
转载一个无依赖的linux的list.h头文件
/** * * I grub it from linux kernel source code and fix it for user space * program. Of course, this is a GPL licensed header file. * * Here is a recipe to cook list.h for user space program *原创 2012-02-16 11:32:17 · 1836 阅读 · 0 评论 -
简易C/C++日志
C/C++没有标准的日志库,很多人使用printf直接代替。但它有个缺点,就是不能对输出信息进行分级控制。使用log4cpp等似乎太重量级了。这里我给一个我自己经常使用的几个简单的日志函数#include #if defined(DEBUG)#define debug(...) {fprintf(stderr, __VA_ARGS__); fflush(stderr);}#else原创 2012-03-27 09:54:58 · 938 阅读 · 0 评论 -
64位机器忽略警告引起严重问题
最近在调试时遇到一个指针问题,百思不得其解。直到搜索了下面这条警告才找到问题的原因。warning: assignment makes pointer from integer without a cast原以为是参数传递的问题,仔细检查,原来是返回值。那段代码在32位机上没问题,到64位就出事了。请看:// main.c main(){ void* c =原创 2012-03-31 11:19:12 · 705 阅读 · 0 评论 -
划清代码职责
错误是具有传染性的。有时一个模棱两可的处理,可能在将来某个时间就会触发更为严重的问题。比如,下面的代码(来源于真实项目)for (it = vec.begin(); it != vec.end();){ if (dosomething(*it) == TRUE) it = vec.erase(it); else it++;}如果dosom原创 2012-03-14 17:45:18 · 761 阅读 · 0 评论 -
VC+Boost静态库编译问题、解决方法
通常来说,在大项目里,用动态链接比静态链接体积要小,缺点就是要带上一个crt库。windows现在又引入了manifest,可以指定crt的版本号,这样对于向上兼容是个不错的方法。如果作为单独的库发布,那么带上crt可能不太现实,因为它们确实不小。所以需要用静态链接。gcc静态连接很方便,只需要把相应的.a文件加入即可。vc2010需要将/MDd改为/MTd。虽然是这样,但如果使用了别人的原创 2012-01-09 22:03:22 · 4698 阅读 · 0 评论 -
Windows中的管道解析
具体来讲,Pipe是一种POSIX规范,在不同系统上都有实现。msvcrt提供了_pipe这个函数。但是,它的实现是基于CreatePipe,这是无庸置疑的。这种非标准(带下划线)的C函数,在CRT中的很多。比如_open返回的文件指针FIFL*,很多时候我们都没有注意到,它几乎等同于CreateFile传回来的HANDLE。在Windows核心编程中,我们知道,每个进程有一个句柄表。创建子进程时原创 2012-03-20 12:22:16 · 4242 阅读 · 0 评论 -
64位C++编程课堂
本系列为http://www.viva64.com/en/l/的学习总结Lessons 1. What64-bit system are目前有2种最流行的64位处理器架构:IA64和Intel 64。IA64即通常所说的安腾,主要用于Sun的服务器上;而Intel64则是与x86兼容的,本文主要讨论这种。 x86-64有以下优点l 64位寻址空间,原创 2012-03-20 12:26:39 · 966 阅读 · 0 评论 -
跨平台C/C++开发的总结
跨平台的代码最好是在写的时候就已兼顾到多平台,即编写和调试分别在两个平台上同时进行。如果是先在一个平台开发后再来做移植,工作量可能会大很多。这种移植可能会用到很多重构方法,假如你没有很好的单元测试流程,那么大规模的重构将很有可能引入bug。 在两个平台同时开发并不困难。首先,你最好能找到在这些平台都可以使用的工具,vim+makefile是个不错的选择,缺点是gdb的调试不是很方便。因此原创 2012-05-03 14:53:51 · 6329 阅读 · 0 评论 -
解决 “dyld: Library not loaded: ” 错误
今天在Mac上搞了一个动态库(开发环境Eclipse+sconsolidator), 生成dylib倒是简单。随后新建一个可执行的demo, 链接时在设置里指定dylib的目录和相应的库名,但-L参数指定的绝对目录死活都连不上,提示找不到此目录,把它换成相对目录就可以,非常诡异。当一切OK后,运行时出错了。错误原因是dylib动态库没加载,我把动态库放在/usr/local/lib和可执行程序目录原创 2011-12-16 21:27:11 · 51780 阅读 · 2 评论