C400

72. OS リリースを判断してコンパイルする方法

OSのリリース・レベルを判断してコンパイルしたい場合がある。
複数の OS にまたがるシステムを開発す場合、このような制御が必要であり
IBM 自身もこれから紹介する方法を利用している。
例えば API : QDFRTVFD の受け取り変数の最大長は OS : V5R2M0 までは
11280 バイトであるが V5R3M0 以降では 32767 バイトへ拡張されている。
同じソースであってもコンパイルするプラットフォームによって
これらを制御するには 事前定義マクロ: __OS400_TGTVRM__ を利用することができる。
コンパイル時には __OS400_TGTVRM__ には OSリリースの値が入る。
例えば、OS V5R4M0 の場合は

__OS400_TGTVRM__ = 540

である。
そこで、これをソースに応用すると次のようになる。

ソースコード
------------------------------------------------------------------------------
0001.00 #include <stdio.h>                                              
0002.00 #include <stdlib.h>                                             
0003.00 #include <string.h>                                             
0004.00 #include <QDFRTVFD.h>                                           
0005.00                                                                       
0006.00 #define TRUE         0                                                
0007.00 #define FALSE       -1                                                
0008.00 typedef struct {                                                      
0009.00    int  BYTESPRO;                                                     
0010.00    int  BYTESAVL;                                                     
0011.00    char MSGID[7];                                                     
0012.00    char RESRVD;                                                       
0013.00    char EXCPDATA[100];                                                
0014.00 } ERRSTRUCTURE;     /* Define the error return structure            */
0015.00 ERRSTRUCTURE  errcode;/* Error Code Structure for RCVMSG      */      
0016.00                                                                       
0017.00 #if (__OS400_TGTVRM__>=610)                                           
0018.00    #define FORMAT_SIZE    32767       /* V6.1 - V7.1 */               
0019.00 #else                                                                 
0020.00    #define FORMAT_SIZE    11280       /* V5R2M0-V5R4M0 */             
0021.00 #endif                                                              
0022.00    int     format_size = FORMAT_SIZE;                               
0023.00 char formatBuf[FORMAT_SIZE + 1];                                    
0024.00 char m_DSPFFLIB[21];                                                
0025.00                                                                     
0026.00 void main(void){                                                    
0027.00   char dspf[11], dspflib[11];                                       
0028.00                                                                     
0029.00   printf("** TESTDSPF **\n");                                       
0030.00   getchar();                                                        
0031.00                                                                     
0032.00    strcpy(dspf, "WDB160D   ");                                      
0033.00    strcpy(dspflib, "WDOTST    ");                                   
0034.00    memcpy(m_DSPFFLIB, dspf, 10);                                    
0035.00    memcpy(&m_DSPFFLIB[10], dspflib, 10);                            
0036.00    m_DSPFFLIB[20] = 0x00;                                           
0037.00    /* QDFRTVFD :  表示装置ファイル記述の検索 */                     
0038.00    memset(formatBuf, 0, sizeof(formatBuf));                         
0039.00    format_size = sizeof(formatBuf);                                 
0040.00    QDFRTVFD((char*)&formatBuf, format_size, "DSPF0100", m_DSPFFLIB, 
0041.00            &errcode);                                               
0042.00    if(errcode.BYTESAVL != 0){/* APIERR */ 
0043.00      printf("* ERROR *\n");               
0044.00    }/* APIERR */                          
0045.00    else printf("QDFRTVFD success !\n");   
0046.00    getchar();                             
0047.00 }                                         
------------------------------------------------------------------------------
【 解説 】
0017.00 #if (__OS400_TGTVRM__>=610)                                           
0018.00    #define FORMAT_SIZE    32767       /* V6.1 - V7.1 */               
0019.00 #else                                                                 
0020.00    #define FORMAT_SIZE    11280       /* V5R2M0-V5R4M0 */             
0021.00 #endif

に対して、このソースを Ver6.1 以上でコンパイルすると

0018.00    #define FORMAT_SIZE    32767       /* V6.1 - V7.1 */

が採用されてコンパイルされ、OS : V5R4M0 以下であれば

0020.00    #define FORMAT_SIZE    11280       /* V5R2M0-V5R4M0 */

が採用されてコンパイルされる。
事前定義マクロ : __OS400_TGTVRM__ については IBM 解説書にも紹介されていないが
V5R2M0 からも利用できるマクロであり弊社も製品の開発に利用している。