编写跨平台的 C++ 代码
文章目录
最近都在写一些跨 Windows 和 Linux 平台的 C++ 代码,略有心得,整理成文,备忘一下。
有关预编译指令
Visual Studio 会自动在源代码里添加
<pre>
#pragma once
<p>
这个指令,在 Linux Gcc 编译器下应该怎么样处理类似的情况呢?
</p>
<p>
<a href="http://en.wikipedia.org/wiki/Pragma_once">维基百科</a>上有一个权威说法:
</p>
<pre>
http://en.wikipedia.org/wiki/Pragma_once
<p>
所以,在编写跨平台的 C++ 代码时,最好使用下面这种方式来获得跨平台的特性:
</p>
<pre>
#pragma once #ifndef GRANDFATHER_H #define GRANDFATHER_H
struct foo { int member; };
#endif /* GRANDFATHER_H */
有关链接库工程的跨平台
Windows 下使用 __declspec(dllexport) 来标明一个动态链接库的函数接口,而在 Linux 下,则完全没有这个必要。
<p>
这个时候,如果动态链接库代码需要跨平台,应该怎么处理呢?
</p>
<p>
你可以用如下宏来进行区分:
</p>
<pre>
#ifdef WIN32 #define EXPORT_XX __declspec(dllexport) #else #define EXPORT_XX #endif
源代码的编码格式
源代码的编码格式,最好统一用 GBK 或是 UTF-8,以避免不同编码器之间转换造成的乱码。
注意代码里的文件名大小写。
Windows 里 include 一个头文件,你的大小写可以随便写。但是在 Linux 上,你得小心了,clsssa.h 你不能写成
<pre>
#include “ClassA.h”
<p>
因为在 Linux 上,文件及目录名是大小写敏感的。
</p></p>
一些类型名称
Windows 处理宽字符集与窄字符集采用的方法,是用宏定义来区分。比如说 TCHAR 在不同的工程下,属于不同的类型。
<p>
而在 Linux 下,则需要注意这些问题。为了让你的代码可移植性强。一定要少用 BOOL, TCHAR 这些类型,而要用原生态的 C/C++ 类型,比如说 bool, char 等。
</p></p>
有关 _tmain 等主函数问题。
默认情况下,Visual Studio 新建的 Win32 Console 工程,全是类似于这样的。
<pre>
int _tmain(int argc, _TCHAR* argv[]) { }
<p>
这些代码,移植到 Linux 下面,就需要我们自己做一部分工作。
</p>
<p>
如果你在 Visual Studio 用的是 Unicode 编码的,则对应的 Linux 代码应该是另外一套。我则是用宏裁剪了两个主函数出来。如果你有什么更好的方法,可以跟我分享。
</p></p>
注意一些库在 Linux 和 Windows 平台下的不同表现
虽然你的程序可能依赖大量的跨平台库,这些库号称是跨平台的,但是很有可能在不同的平台的表现,会有所不同。例如,log4cxx 在 Linux 和 Windows 下就会有字符集设置的差别。
<p>
你在编写跨平台代码的时候,就应该特别小心这些库的细微差别,及时调整。
</p></p>
后记
以上是一些跨平台 C/C++ 代码编写的经验,备忘一下,也希望对大家有用。
文章作者 cookwhy
上次更新 2011-12-27