由setlocale解决中文显示引发的探索

来源:互联网 发布:python nonzero 编辑:程序博客网 时间:2024/05/21 01:28

1.关于MD(d)MT(d)编译选项的区别

编译选项

包含

静态链接的lib

说明

/MD

_MT、_DLL

MSVCRT.lib

多线程、Release、DLL版本的运行时库

/MDd

_DEBUG、_MT、_DLL

MSVCRTD.lib

多线程、Debug、DLL版本的运行时库

/MT

_MT

LIBCMT.lib

多线程、Release版本的运行时库

/MTd

_DEBUG、_MT

LIBCMTD.lib

多线程、Debug版本的运行时库

简单的说:

(1)/MD(d),表示运行时库由操作系统提供一个DLL,程序里不集成。程序在运行时,调用当前系统的运行时库。

(2)/MT(d),表示运行时库由程序集成。在编译链接的时候,直接把当前系统的运行时库集成到程序中。

需要注意的是,/MT(d)下,不同模块有自己的运行时库,需要避免在A里面分配堆,在B中去释放程序会崩溃。

2.关于setlocale和_configthreadlocale请查看msdn

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)使setlocale只针对当前线程起作用

_configthreadlocale(_DISABLE_PER_THREAD_LOCALE)使setlocale对所有线程的设置都有用(默认值)

3.在我们项目中,遇到在exe中调用setlocale(LC_ALL, "");然后在dll中调用wprintf(L"中文");后,wprintf并没有输出。

通过查找google和msdn,知道setlocale需要搭配另一个函数_configthreadlocale使用。但是即使我在exe中使用

_configthreadlocale(_DISABLE_PER_THREAD_LOCALE)来启用setlocale的更改对所有线程都起作用也不能解决问题。

最后发现这个问题并不是因为线程所导致。而是由于项目中,exe和dll的编译选项都采用的是/MT(d),导致exe和dll都有各自的运行时库,

setlocale只能在各自的运行时库里生效。

原创粉丝点击