Windows与Linux编译器的区别(2)

  (1)基本类型大小和结构对齐

  首先是 C/C++语言基本类型的大小,以及相应的结构对齐问题。典型的例子是long关键字。在Visual C++ 2003下,sizeof(long double)是8,其大小和double一致。但是在GCC 4.1.0上,sizeof(long double)等于12,其大小比double多4。另一个和大小相关的问题是对齐问题。不同编译器的默认对齐大小是不一样的。一般情况下程序逻辑都跟对齐无关,但是涉及从磁盘或者网络文件中读取结构时(如解析资源),精确的对齐就是必需的。考察下面的程序段:

#include
struct A

{
char a;
double b;
};

int main()
{
printf("%d %d %d\n", sizeof(long double),
sizeof(long long), sizeof(A) );
return 0;
}

  上面这段程序在 Visual C++ 2003编译器默认设置下,输出结果为8 8 16;在GCC 4.1.0编译器默认设置下,其输出为12 8 12。从sizeof(A)的大小可以看出,Visual C++ 2003是按8字节对齐的,而gcc是4字节对齐的。这时需要使用#pragma pack预编译指令来修改头文件中的结构声明,或者在运行时调整内存中结构成员的位置。不管采用何种方法,对齐都是需要小心处理的事情。

  一个引起最大麻烦的基本类型是wchar_t。在Visual C/C++ 2003编译器中,wchar_t的大小是2字节,并且可以和unsigned short类型互相赋值。与此关联的一系列Unicode相关函数,比如wcslen,wcscmp等,都接受UTF16格式的Unicode串。在 GCC中,其大小是32位。与此相关的wcslen,wcscmp函数都接受UTF32格式的Unicode串。为此,必须在Linux上开发一套 UTF16接口的wcs系列函数,以保证UTF16的字符串被正确处理。与此同时,使用宏定义来替换wchar_t关键字为unsigned short,以保证函数声明的兼容。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzwfyx.html