【转】

1.1. 宏定义
软件的代码,从跨平台的角度来看,可以分为平台相关的和平台无关的。采用C/C++编写的软件,在进行移植时,平台无关的的代码基本上不需要做大的改动,但平台相关的代码需要做很大的调整。这里所说的平台包括操作系统和编译器,为了能够做到让编译器在编译时根据当前的平台状况来自动选择需要编译的代码,我们一般需要用C/C++的编译宏指令来实现。举个例子,下面的一段代码是得到系统当前的时间并且格式化成字符串的操作,注意其中宏指令#ifdef …#else…#endif的使用。这段代码可以在Win32、Linux和大多数Unix平台通过编译:

 

   1: #include <stdio.h>;
   2: #include <time.h>;
   3: #ifdef WIN32
   4: #define LOCALTIME_R(t)  localtime((t))
   5: #define SNPRINTF _snprintf
   6: #else
   7: #define LOCALTIME_R(t)  localtime_r((t), (struct tm *)&tmres)
   8: #define SNPRINTF snprintf
   9: #endif
  10: char * getcurrentdate(char *buffer, unsigned int buflen)
  11: {
  12:   if (buffer)
  13:   {
  14:     struct tm *tmnow;
  15:     time_t long_time;
  16:     time(&long_time );                     /* Get time as long integer. */
  17:     tmNow = LOCALTIME_R( &long_time );  /* Convert to local time.     */
  18:     SNPRINTF(buffer, buflen, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d",
  19:       tmnow ->;tm_year+1900, tmnow ->;tm_mon + 1, tmnow ->;tm_mday,
  20:       tmnow ->;tm_hour, tmnow ->;tm_min, tmnow ->;tm_sec);
  21:   }
  22:   return buffer;
  23: }

 

研究一下上面的代码我们可以发现,由于一些库函数是非ANSI标准的,平台间有些差异,比如获得格式化字符串的函数在Win32平台叫_snprintf,而在Unix/Linux平台叫snprintf,它们之间的差别不是太大,通过使用编译宏指令就可以区分。