zoukankan      html  css  js  c++  java
  • 利用宏定义实现C++程序在Unix和Win32环境下的通用性

    【转】

    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,它们之间的差别不是太大,通过使用编译宏指令就可以区分。

  • 相关阅读:
    第七周进度报告
    解析极限编程阅读笔记02
    解析极限编程阅读笔记01
    第六周进度报告
    合作开发项目-地铁线路查询
    构建之法阅读笔记03
    关于DeferredResult的思考
    java实现任务调度
    java里面如何提升编写速度
    收集整理mysql数据库设计规范与原则
  • 原文地址:https://www.cnblogs.com/shawnpoo/p/3317802.html
Copyright © 2011-2022 走看看