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