Linux/Android NDK wchar_t 陷阱

在linux里wchar_t默认是32位的,通常android也是如此,但是我们知道可以通过给编译器加上 '-fshort-wchar'选项使其变成16位,于是这里就会有一个陷阱。
在gcc手册中会有一段针对这个flag的警告: The -fshort-wchar switch causes GCC to generate code that is not binary compatible with code generated without that switch. Use it to conform to a non-default application binary interface.
所以在使用-fshort-wchar之后意味着现在用gcc/g++编译出来文件的wchar_t是16位的,但是如果有外部的库呢?例如标准库函数我们是否还能继续使用?
答案是否定的,因为这些标准库在通常情况下是使用默认的wchar_t编译,即32位,所以手册中有警告我们在使用这个flag之后也同时需要切换对应的Application Binary Interface. 如果还继续使用默认的ABI则会造成各种不可预知的问题, 例如将16位当成32位来处理(有时候我们调用wcslen就只会得到原本字符长度的一半)。
可以简单在linux编译一段小程序,只需调用wcslen来检查长度,然后通过加上'-fshort-wchar'和不加,比较编译出的程序的执行结果就可以很明显看到问题。

你可能感兴趣的:(NDK)