随笔-3  评论-12  文章-0  trackbacks-0
  2010年5月14日

问题一:类的静态指针类型的属性初使化

//test.h

class Test

{

...

public:

  static WORD* m_test;

...

}

 

//test.cpp

#include "test.h"

WORD* Test::m_test = 0;

...

 

问题二:类中的模板方法

类中的模板方法不能在cpp中实现,可以在h文件中定义时即实现:

//test.h

class Test

{

...

public:

  template<class T>

  BOOL TestMethod(T& result)

  {

    result = ...;

    return TRUE;

  }

...

}

 

以上两问题如出现均会出现linker错误

北京空调维修中心

海尔空调维修

 

posted @ 2010-05-14 09:34 李立 阅读(772) | 评论 (26)编辑 收藏
  2010年5月6日
1 . VC8(VS2005)

   VC8能识别的源文件编码有三种:ANSI(本地codepage),utf8,utf16. 后面两种要保留BOM,否则VC8不能识别。

   基本上源文件的编码其实只对文件中的字符串的值有影响。

先说结论:
对于普通字符串("中文1234"),VC8会把它从源文件的编码格式转为ANSI字符串。
对于宽字符串(L"中文1234"), VC8会把它从源文件的编码格式转为utf16字符串。

例子1:test.cpp (编码是utf8)
#include <stdio.h>
#include <string.h>

#define TEST_MSG            "中文1234"

int main(int argc, char* argv[])
{
    char buf[1024]={0};
    strcpy(buf,TEST_MSG);
    printf("%s\n",buf);

    for(int i=0;buf[i]!=0;++i)
    {
        printf("0x%2x ",(unsigned char)buf[i]);
    }
    return 0;
}

如果这个程序在codepage 936(简体中文)上面去compile
输出的结果就是
中文1234
0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
可以看出是gb2312的编码,而不是utf8

如果这个程序在codepage 932(日文)上面去compile
输出的结果就是
中文1234
0x92 0x86 0x95 0xb6 0x31 0x32 0x33 0x34
可以看出是shift-jis的编码,也不是utf8
(注:shift-jis也包含"中文"两个字)

也就是说同样的source code在不同的code page下产生不同的可执行文件

例子2:test.cpp (编码改为ANSI)
如果这个程序在codepage 936(简体中文)上面去compile
输出的结果就是
中文1234
0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
可以看出是gb2312的编码,而不是utf8

把相同的file拷贝到codepage 932(日文)上面去compile
输出的结果是
ヨミホト1234
0xd6 0xd0 0xce 0xc4 0x31 0x32 0x33 0x34
可以看出是binary内容相同,但是string却不同了

例子三:test.cpp (编码utf8)

#include <stdio.h>
#include <string.h>

#define TEST_MSG            L"中文1234"

int main(int argc, char* argv[])
{
    char buf[1024]={0};
    memcpy(buf,(const char *)TEST_MSG,sizeof(TEST_MSG));
    //printf("%s\n",buf);

    for(int i=0;i<sizeof(TEST_MSG);++i)
    {
        printf("0x%x ",(unsigned char)buf[i]);
    }
    return 0;
}

在任何平台下使用vc8去compile,结果都应该是输出
0x2d 0x4e 0x87 0x65 0x31 0x0 0x32 0x0 0x33 0x0 0x34 0x0 0x0 0x0

顺便考你一下:
如果想输出"中文1234"的utf8格式,应该如何写代码,保证vc8在任何语言平台下面去compile,结果都一样正确?


2. gcc/g++
gcc/g++似乎不支持utf16编码的源文件
可以处理ANSI和utf8格式的源文件(no BOM)

如果采用例子一所用的源文件(utf8编码)
会输出
0xe4 0xb8 0xad 0xe6 0x96 0x87 0x31 0x32 0x33 0x34
可以看出是utf8是编码

这一点上看vc8和gcc是不同的

如果采用例子三所用的源文件(编码是utf8,使用L和wchar_t)
会输出
0x2d 0x4e 0x0 0x0 0x87 0x65 0x0 0x0 0x31 0x0 0x0 0x0 0x32 0x0 0x0 0x0 0x33 0x0 0x0 0x0 0x34 0x0 0x0 0x0 0x0 0x0 0x0 0x0
可以看出gcc的wchar_t是四个字节,跟vc8也不同
澳柯玛空调维修 格兰仕空调维修
posted @ 2010-05-06 07:48 李立 阅读(220) | 评论 (0)编辑 收藏
  2010年4月28日

 

近日编写的程序中到处都用了的try...catch处理,但总是会静静地退出,从外部的进程查询它的退出码,结果是0xc0000417,上网一查,未知软件错误。

它是谁来抛出的异常?windows,C++库,用户代码?

我真没有抛出这样的异常,windows自己抛出的异常就应该不叫未知软件错误了,估计是C++框架抛出的。

那么怎么找呢?我直接到VS的安装目录去找0xc0000417,结果在ntstatus.h找到定义:

//
// MessageId: STATUS_INVALID_CRUNTIME_PARAMETER
//
// MessageText:
//
// An invalid parameter was passed to a C runtime function.
//
#define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417L)

原来是非法句柄错误,但我又没有用_set_invalid_parameter_handler设置处理回调函数。

这样C++框架发现了这一情况,就调用了_invoke_watson函数,它把UnhandledExceptionFilter重设

(导致程序一开始设置的UnhandledExceptionFilter不可用),然后调用默认的UnhandledExceptionFilter之后,

就TerminateProcess结束进程,这就是为什么程序总是静静地退出了。


百野燃气灶维修     老板燃气灶维修
posted @ 2010-04-28 08:15 李立 阅读(697) | 评论 (1)编辑 收藏
仅列出标题