[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Solaris9(SPARC) 用ミドルウェアをHP-UX11i(Itanium2)に移植する仕事をしているが。
Sun 純正CコンパイラやGNU C(gcc)コンパイラは
事前定義マクロ(predefined macro)が豊富なので、
それらを使って、
OS別CPU別のコーディングができる。
ところが。
今回はHP純正Cコンパイラ‘HP C/HP-UX’を使うのだが、
OSやCPUを識別するための事前定義マクロが
プログラマ・ガイドに記載されていないため、
いろいろ探し回ったり調べたりした。
こんなんが、使える。
__unix UNIX である
__hpux HP-UX である
__ia64 Itanium CPU を識別する
__func__ このマクロ名を記述してる関数名
ついでに、明文化されてるやつも書いとけ。
__STDC__ ANSI C準拠
__DATE__ コンパイル日付
__TIME__ コンパイル時刻
__FILE__ ソースファイル名(basenameのみ)
__LINE__ 行番号
あと、
デバッグ用表示機能文用マクロ定義に
‘__VA_ARGS__’
を使ったりするが、
“HP C/HP-UX”でも使えた。
例えば、
#define dbg(...) (fprintf(stderr,"%s:%u @%s",__FILE__,__LINE__,__func__),fprintf(stderr," "__VA_ARGS__))
/**
* funcition: funcHello
*/
void funcHello(void) {
#ifdef DEBUG
dbg("hello HP-UX\n");
#endif
}
ただし、
SQLを組み込んだものだと、
Oracle Pro*C/C++(proc)プリコンパイラは、
__VA_ARGS__
__func__
を識別できず、コンパイルエラーになる。
ここは創意工夫が必要。
ちなみに、
“proc”は
ORA_PROC
という事前定義マクロがある。
これ、結構便利。
プリコンパイラに通させたくないヘッダのinclude とか以下のようにする。
#ifndef ORA_PROC
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#endif
ちっと問題が。
OSのバージョンやコンパイラのバージョンを取得できる事前定義マクロが見当たらない。
"HP aCC"C++コンパイラだと
__HP_aCC
という事前定義マクロでコンパイラ・バージョンが分かるようだが、
それのライセンスがないから使えないのよねぇ。
はあ、不便。
コンパイラの“-D”オプションで指定しろ、てか。
% cc -D__HPUX=`uname -r` hoge.c
そもそも、
なんでOSにHP-UX を選定したんだろ、ユーザさんは。
Itanium2サーバなら、
Linux(RedHat Enterprise)も選択できだぢゃん。
そしたら、GNU C 使えたのに。
ま、
あと2ヶ月で今のプロジェクトともオサラバするし、
良しとするか。