最近都在写一些跨 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++ 代码编写的经验,备忘一下,也希望对大家有用。