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 からも利用できるマクロであり弊社も製品の開発に利用している。