(1)宏 QT_NO_CAST_FROM_ASCII
与之类似的还有QT_NO_CAST_TO_ASCII
任何良好风格源代码或者愿意成为良好风格的源代码,都应该使用该宏。
该宏的作用在QString的Manual中有介绍: Disables automatic conversions from 8-bit strings (char *) to unicode QStrings其目的是,强制所有需要转换为Qt字符串的C中的const char*窄字符串都使用:
QLatin1String(const char*)
QObject::tr(const char *) QString::fromXXXX QTextCodec::toUnicode ( const char *) ... 不然将会编译时直接报错,比如 QString val("dbzhang800"); val = "dbzhang801";在定义该宏的情况下,直接报错。因为没有 QString(bool) 这样的东西哈。
注意:字符串指针可能被转换成为bool或其他基本类型,而对于部分类,比如 QScriptValue,是有对应构造函数而不报告编译错误。
参考
(2) MSVC 的转码动作
不同的msvc的编译器对源代码的编码有不同处理,这里仅指msvc2008。 如果源码文件是带BOM的utf8,utf16等编码格式,它会有转码的动作。 这样一来,tr()包住的字符串将转码成时GBK、BIG5等system编码,与源文件所用的编码不同。所以,msvc实际使用的字符和源代码中字符的编码可能不同,并且影响到程序运行setCodecForTr/setCodecForLocale/setCodecForCStrings和lingust翻译等工具
另外QT4.6中尽管简体中文的windows系统中使用gb2312,应该直接指定SYSTEM而不要指定GB2312 ,从而可以避免使用codecs插件。