mokky14's IT diary

IT関係の仕事メモ、勉強会の感想など書いてます。

C言語でLinux、Solaris向け処理を#ifdefで分岐

Solarisで作ったアプリをLinuxにポーティングするため、SolarisLinux固有の処理を#ifdefで分けて記載する必要があって、#ifdefの識別子が何だったか分からなくて調べたので、メモ残しとく。

とりあえずこんなソースを用意。

#include <stdio.h>

int main()
{
    puts("--start--");

    #ifdef __unix
    puts("unix");
    #endif

    #ifdef __linux
    puts("linux");
    #endif

    #ifdef __GNUC__
    puts("GNUC");
    #endif

    #ifdef __sun
    puts("sun");
    #endif

    #ifdef __sparc
    puts("sparc");
    #endif

    #ifdef __solaris
    puts("solaris");
    #endif

    puts("--end--");
    return 0;
}

Linux(x86)環境での確認結果。

$ gcc ifdef.c 
$ ./a.out
--start--
unix
linux
GNUC
--end--

Solaris(SPARC)環境での結果。
Sunstudioとgccの2つで試した。

$ /opt/SUNWspro/bin/cc ifdef.c
$ ./a.out
--start--
unix
sun
sparc
--end--
$
$ /usr/sfw/bin/gcc ifdef.c
$ ./a.out
--start--
unix
GNUC
sun
sparc
--end--

Solaris(x86)環境での結果。
gccはインストールされてない環境だったのでSunstudioでの確認のみ。

$ /opt/SUNWspro/bin/cc ifdef.c
$ ./a.out
--start--
unix
sun
--end--

とりあえずLinuxSolarisで#ifdefで処理分けるときの識別子は

Linux Solaris
__linux __sun

を使えばいいんだな。

x86用の識別子は32bitアプリと64bitアプリの絡みもあって何だか面倒くさそうなので、後で調べることにしよう。