Portability.txt
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:5k
源码类别:

GIS编程

开发平台:

Visual C++

  1. This note collects a bunch of portability issues that I've found in
  2. ensuring that GLUT example source code is truly portable.  I encourage
  3. contributors to the GLUT source code distribution to review these
  4. guidelines:
  5.   o  Avoid variables, routines, or structure elements named "new" or
  6.      "delete" to avoid these C++ keywords.
  7.   o  Avoid the "near" and "far" keywords introduced by Intel.  Instead
  8.      try using "nnear" and "ffar" since these are common names in
  9.      graphics programming.
  10.   o  Do not assume the <math.h> defines M_PI.  Instead, after including
  11.      <math.h>, say the following:
  12. -----------------------------------------------------------------------
  13. /* Some <math.h> files do not define M_PI... */
  14. #ifndef M_PI
  15. #define M_PI 3.14159265358979323846
  16. #endif
  17. -----------------------------------------------------------------------
  18.   o  If you use the GLU tessellator, when you define or declare
  19.      callback functions, use the "CALLBACK" calling convention
  20.      identifier.  This is required for the callbacks to work correctly
  21.      under Win32.  After including <GL/glut.h>, say the following:
  22. -----------------------------------------------------------------------
  23. /* Win32 calling conventions. */
  24. #ifndef CALLBACK
  25. #define CALLBACK
  26. #endif
  27. -----------------------------------------------------------------------
  28.      Then using a GLU tessellator begin callback as an example say:
  29. -----------------------------------------------------------------------
  30. static void CALLBACK
  31. begin(GLenum type, void *polyData)
  32. {
  33.   glBegin(type);
  34. }
  35. -----------------------------------------------------------------------
  36.      When registering the callback, say:
  37. gluTessCallback(tess, GLU_TESS_BEGIN_DATA, (void (CALLBACK*)()) &begin);
  38.   o  Avoid the floating point trig and exponential functions such as
  39.      "sinf", "cosf", "expf", etc.  These functions are reserved by ANSI
  40.      C but not mandated.  Instead use the double precision mandated
  41.      functions "sin", "cos", "exp", etc.  Some systems also support
  42.      "fcos", "fsin", etc; definitely avoid these.
  43.   o  Do not use the EXIT_FAILURE and EXIT_SUCCESS constants defined by
  44.      ANSI C.  Some old systems do not define these in stdlib.h but are
  45.      otherwise ANSI C compliant.  Instead use "exit(1);" for failure
  46.      and "exit(0);" for success.
  47.   o  Use "rand" to generate random number.  Do not use "random" or "drand48"
  48.      since they are not supported under Win32.
  49.   o  Avoid using "gettimeofday" or other system dependent routines to
  50.      determine a timestamp.  Instead use
  51.        timestamp = glutGet(GLUT_ELAPSED_TIME);
  52.   o  If you need to read a directory, check out the "win32_direct.h"
  53.      file used in progs/demos/walker/walker.c
  54.   o  Try to avoid including <unistd.h> since it is not in Win32.
  55.   o  If your program runs in single buffered mode, be sure to call
  56.      glFlush() at the end of your display callback.  Some OpenGL
  57.      implementations need a glFlush for pending graphics commands
  58.      to fully execute.  Note that glutSwapBuffers performs an
  59.      implicit glFlush operation.
  60.   o  Avoid using strdup because strdup is not an actual ANSI C or
  61.      POSIX required routine.  Indeed, OpenVMS does not support it.
  62.      And standard Linux libc only advertises strdup in string.h 
  63.      if BSD or SVID routines are requested.  Instead, directly include
  64.      the routine below:
  65. -----------------------------------------------------------------------
  66. static char *
  67. stralloc(const char *string)
  68. {
  69.   char *copy;
  70.   copy = malloc(strlen(string) + 1);
  71.   if (copy == NULL)
  72.     return NULL;
  73.   strcpy(copy, string);
  74.   return copy;
  75. }
  76. -----------------------------------------------------------------------
  77.   o  Do not #include <getopt.h>; some platforms like IBM's AIX do not
  78.      have a getopt.h header file.  Instead, you can portabily rely on
  79.      getopt() to be declared in <unistd.h> on Unix machines.  Still,
  80.      Win32 does not have a builtin getopt.
  81.   o  IBM's AIX defines "quad" to be a 64-bit type in <sys/type.h>.
  82.      Avoid using quad as a variable name.
  83.   o  HP's HP-UX 10.20 may have a type or otherwise define "time".
  84.      Avoid using time as a variable name.  XXX GLUT doesn't do this
  85.      well currently.
  86.   o  GLU 1.2 introduced the types GLUquadric, GLUnurbs, and
  87.      GLUtesselator as aliases for the older GLUquadricObj, GLUnurbsObj,
  88.      and GLUtesselatorObj type names.  Avoid the newer type names; use
  89.      the older names with the "Obj" suffix since all versions of GLU
  90.      support the Obj-suffixed types.  (Note: yes, the GLU API has
  91.      GLUtesselatorObj is spelled incorrectly - tessellator should have
  92.      two l's.)
  93.   o  Do not include <malloc.h> to get the standard C malloc/free
  94.      routines.  Instead, include <stdlib.h>.  FreeBSD and probably
  95.      other systems lack a <malloc.h>.
  96.   o  Linux systems prototype a function called "idle" in <unistd.h>.
  97.      This can result in an error in GLUT programs that name their
  98.      idle callback "idle" and include <unistd.h>.  Do no use a function
  99.      named idle if you include <unistd.h>.
  100.   o  The SunOS 5.6 version of <assert.h> requires that <stdio.h> also
  101.      be included because the assert() macro uses stderr.  Be sure to
  102.      include <stdio.h> along with <assert.h> everywhere to avoid
  103.      build errors on SunOS 5.6.
  104. - Mark Kilgard
  105.   October 17, 1998