C / C++ / VC 点滴

语法

template

大多数编译器(包括VC)要求template函数必须写在.h当中
导致实现该template函数所需要的其他头文件则必须包含在.h当中.
解决方法是可让template函数调用另一非template函数,而这个非template函数在.h中声明,.cpp实现!

bitfield(位域)

可用来表示位定义, 但不可对单独的域指针或引用(即不可对其取地址)

用法

struct s_bitfield 
{    /* little endian */
    int bit0    : 1;
    int bit1_3  : 3;
    int bit4_11 : 8;
    int         : 4; // 可以不写名字, 用来表示不关心的位
    int bit16   : 1;
    int         : 0; // 长度写0, 并不代表没有长度, 而是使其对齐到边界(默认位32位 word)
};

声明顺序

bit-field 的位顺序和endian是一致的, 其声明的顺序即为内存中的顺序.

endian 字节顺序(addr=0,1,2,3) bit声明顺序
little B0 B1 B2 B3 b0,b1,…b31
big B3 B2 B1 B0 b31,b30,…b0

生成字节指令的问题

bitfield可能会生成字节指令, 这对于不支持字节指令的存储空间会导致错误.
ANSI C标准并未对此作出规定, 具体的解决方法与编译器有关.

  • 对于ARM的编译器

如果在某个bitfield之前加volatile, 则对该field操作时不会生成字节指令
参见 http://www.arm.com/support/faqdev/1463.html

  • 对于 GCC

默认会对第二次bit-field操作产生ldrb, strb之类的字节指令.
从version 4.2.0开始修正了这个问题,采纳了ARM的做法
参见 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23623

其他

  • const_cast<char*>(sz)

可将char*转化成const char*(有些场合要求const!)

  • 数组长度的获取

int len = sizeof(array)/sizeof(array[0]);

系统调用

thread

结束另一个线程中的界面的方法:

  1. SendMessage(hWnd,WM_CLOSE,0,0);
  2. UIthread.PostThreadMessage(WM_QUIT,0,0);

ini

Get/SetProfile函数提供了int,string,struct(本质是void buffer) 3种形式的读写ini文件方式
文件读写过程中,参数名及其值可用数组统一管理,如此处理程序即可通用化并封装成类

系统计时器

QueryPerformanceFrequence 得到系统计数器频率
QueryPerformanceCounter 得到系统计数器当前数值
搭配使用可精确计时(ms)

ARM RVDS 环境

makefile的bug

在RVDS 3.0上, 生成的makefile不会包含后缀为C的文件! 改为小写正常.

RVDS的窗口模式

起初认为全浮动的窗口特别难看, 所以立马改成了传统的MDI.
但是后来偶然发现浮动窗口模式配合外部编辑器很方便.
可以把工程以及其他非编辑窗口挪到屏幕周边, 然后把外部编辑器, 比如VIM放到屏幕中间.
设置RVDS使用外部编辑器, 然后点RVDS工程窗口里面的文件就会打开在VIM.

外部编辑器的设置是 : gvim.exe +%line% %file%

VC环境

文件类型

  1. dsp 工程文件:文件组织关系,工程设置
  2. dsw 工作区文件:工程依赖关系,vcs设置
  3. clw classwizard文件(可重建)
  4. opt 选项文件:工程中的class组织,调试窗口内容
  5. ncb IntelliTips记录文件(可重建,当IntelliTips功能失效时,重建该文件即可恢复)
  6. <configuration>/bsc browser info文件
  7. mak 生成的makefile
  8. dep 生成makefile时附带生成的代码依赖关系文件,由mak包含

configuration

  1. 配置中包含的内容:包含的文件及其编译设置
  2. 配置依赖规则:2个工程有依赖关系时,他们的配置按照最接近的名字来对应,一般设为一致
  3. debug和release版本差别主要在optimization和debug info:这2点是独立的,不相干,可分别设置
  4. release中的优化可通过编译指令单独开启或关闭,可用来解决debug/release不一致的问题

profile

  1. profile和incremental link是互斥的,使能profile会导致Edit&Continue功能(ApplyCodeChange)不可用,不过profile一般针对release,所以该功能无效不影响使用
  2. 可针对函数profile,不过要使用decoration name指定,可参见生成地map file

数制问题

VC窗口中输入数字时,默认是作为16进制处理的,但可更改为10进制(这个问题上很容易出错)

RTTI

C/C++ Tab -> Enable Run-Time Type Information使能后可正常使用typeid等特性动态判断类型,但不使能时,编译并不会出错,运行时则会异常!
coding note

serialize

可用于socket,从而统一文件log文件读写和socket收发方式,方便处理

调试可视化

调试复杂程序前,先把观察环境建立好以方便分析内部过程

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.