C, C++, Obj-C

XCode中cpp文件第一行出现Parse Issue: Expected unqualified-id错误的原因

移植Win32下的cpp文件到xcode中编译时发现,代码可以顺利通过编译,但在xcode中一查看cpp文件就会出现标题中的那个错误,虽然不影响编译运行程序,但是所有的h中的关键字都不能高亮且会导致一些关联的语法错误,起初以为是header search path的问题,但排查一通后发现问题原来是出在源文件的编码方式上!

xcode默认是使用UTF-8作为源代码文本文件的字符编码的,曾经为了统一这个,Win32下的cpp也改为了UTF-8,但是windows下的UTF-8文本文件头中会加入几个字节的编码标示,比如UTF-8是EF BB BF,UTF-16也有,是什么记不清了,是2个byte的。

导致xcode parse source时出错的就是这个字节标识,删掉就可以了。

deprecated conversion from string constant to char *

可能是xcode4用的gcc版本比较高的原因,在移植代码的时候出现了这样一个警告,正好提高了一下对const char*的认识。

void foo(char* szArg);

这样的函数这样 foo(“test”); 调用就会提示这个警告,以前可能没太注意过,因为传递的参数字符串是被作为常量处理的,而函数原型却要得不是const指针,也就是说函数内实现是允许修改指针内存的,所以编译器就爆了,理所应当的一个warning,改成const char*参数类型就可以了。

Your debugger is not using the correct symbols

今个用WinDBG研究IDT时突然出现!idt命令提示Your debugger is not using the correct symbols,不知何故,试了一些网上提到的解决方法,都不太好使,结果发现只要简单的.reload一下就可以了,真是莫名其妙。

The source file is different from when the module was built.

*******************************

Source file: D:\Projects\StereoMatch\stereomatcher.cpp

Module: D:\Projects\StereoMatch\Debug\StereoMatch.exe

Process: [4024] StereoMatch.exe

The source file is different from when the module was built. Would you like the debugger to use it anyway?

*******************************

***********************************

At StereoMatcher.cpp, line 166 (‘ComputeCorrespondence()’, line 128)

The breakpoint will not currently be hit. The source code is different from the original version.

Continue reading…

关于stl vector调用erase后的Vector iterators incompatible!

出错代码如下(VS2010),使用vector迭代器遍历并对满足条件的元素进行删除,

	vector::iterator it=m_vecDataUnits.begin();
	for (;it!=m_vecDataUnits.end();)
	{
		if (it->m_bSelected)
		{
			m_vecDataUnits.erase(it);
		}
		else
			it++;
	}

正确方法如下,删除vector元素后的it应该使用erase返回的值

	vector::iterator it=m_vecDataUnits.begin();
	for (;it!=m_vecDataUnits.end();)
	{
		if (it->m_bSelected)
		{
			it = m_vecDataUnits.erase(it);
		}
		else
			it++;
	}

Visual Studio下的C++程序断点windows api调试的方法

就当是个记录吧,收藏夹多了也不好找。
以前抄过一个利用dbghelp api来进行release版调试跟踪的工具类,就是当release版exe在客户机上异常后记录堆栈,局部变量,寄存器值等的东西。突然发现一个小问题需要断点调试检查,但发现这个在挂着调试器的时候就不起作用了,google发现这篇文章:
http://www.debuginfo.com/articles/debugfilters.html
大概意思看明白了,结果文中提到的下windows api断点的部分不知道怎么做,继续google发现MSDN上有大致说明:
http://msdn.microsoft.com/en-us/library/d16ayc6z.aspx
手动添加断点的location要这样:{,,USER32.DLL}_MessageBeep@4,用起来还是比较麻烦的,因为还要涉及到api的dll中导出decorated name,不过至少是能用了,知足常乐。
PS:注意这个提到的是32bit系统下,而且调试时需要导入这些加在的系统dll的调试符号,好在发现VS2010有个Load symbols from microsoft symbol servers,虽然下载慢了点不过还是挺方便的。

支持C++标准库的Android NDK CrystaX!

最近在研究Box2D物理引擎在Android上的应用时,发现直接用NDK移植C++版本时遇到了一些STL库的问题,类似b2BroadPhase.h中的:
// Sort the pair buffer to expose duplicates.
std::sort(m_pairBuffer, m_pairBuffer + m_pairCount, b2PairLessThan);
这里,其它地方通过直接替换标准c函数还好解决,这种需要STL库的用法就不好办了。在Box2D的论坛上发现有人提到有个叫CrystaX的第三方版本的NDK,整合了C++标准库,可以直接在不修改任何源码的情况下编译Box2D!
下载地址:http://www.crystax.net/android/ndk.php

[ZT]简单内存泄漏检测方法,解决Detected memory leaks!问题

原文地址:http://hi.baidu.com/v71000/blog/item/414437de599dfed58c102929.html

工作环境:WIN7,VS2005:

最近一个项目中,程序退出后,每次都出现内存泄漏,每次退出的时候泄露的内存块都是1654,1650。

Detected memory leaks!
Dumping objects ->
{1654} normal block at 0x01CC1B28, 40 bytes long.
Data: 54 00 69 00 63 00 6B 00 65 00 74 00 20 00 69 00
{1650} normal block at 0x01CC1BF0, 16 bytes long.
Data: 64 6B E8 95 68 79 0D 4E FD 80 7F 4F 28 75 00 00
Object dump complete.

解决方法

1、在程序开始的地方,加上代码:_CrtSetBreakAlloc(1654); //1654为上面内存泄漏的块号。

2、用Debug模式运行,程序自动断点在“内存块1654”分配的位置。

3、这个时候一直利用“调试”-“退出”,或快捷键“SHIFT+F11”跳转,直到看到了自己的代码。

4、检查自己在该代码中分配的内存块,是否进行了合理的释放。

MFC控件CListBox调整大小时的高度注意事项

CListBox控件在进行调整大小时,默认是按照控件内item的高度进行高度变化递增的,也就是说,高度会是单个项高度的倍数,以便完整显示可见项。这样在父窗口OnSize时调整控件大小会出现高度和计算出的填充全客户区大小高度不一致的问题,显示上会有部分区域重绘错误。改变这种默认高度行为的方法就是在创建控件时,加上LBS_NOINTEGRALHEIGHT这个style bit。