IA32環境のlongが32bit
IA32e(IA64)環境でlongが64bit
という前提の下

uint64_t a=0; #として
printf("%llu\n", a);
とするとIA32では、コンパイル時にwarningが出ないけど、
IA64ではwarning出ます。
#longが64bitなので
#まぁwarningだから無視してもいいけど。。。

#if (BITS_PER_LONG == 32)
printf("%llu\n", a);
#else
printf("%lu\n", a);
#endif

とすると、コンパイル時にはどちらの環境でもwarningが
でません。

で、↑のプリコンパイラ文を使う方法以外の解決案(マクロ)
あったら教えてください。