共通で使えるソースも試す(ワイド文字版)

前回は文字列をバイト列で扱ったが、
今回はワイド文字版でlinuxとWindowsの共通ソースを作成してみる。

hello.c
#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
    setlocale(LC_ALL, "");
    fwide(stdout, 1);
    wprintf(L"%ls\n", L"hello world");
    wprintf(L"%ls\n", L"こんにちは世界");
    return 0;
}

linux向けにコンパイルするには、

$ gcc -Wall -Wextra -std=c99 -Wpedantic -o hello hello.c

fwidewprintfはC95で追加された関数なので、
-ansiではなく-std=c99を指定する*1
ANSI Cソースとしてコンパイルすると、
宣言の無い関数として警告されるものの、
実際に動作する実行イメージは作られる。
とはいえ、コンパイラの警告を無視するのは危険だ。
ANSI Cではwchar.hそのものも無いはずだが、
gccはもっと新しい規格にも対応するためにwchar.h自体は持っている*2ので、
そんなインクルードファイルはありませんとは言ってくれない。

Windows向けにクロスコンパイルする場合も同様に、

$ i686-w64-mingw32-gcc -Wall -Wextra -std=c99 -Wpedantic -o hello.exe hello.c

ただ、この場合、なぜか-std=c99でなく-ansiでもコンパイラは警告一つ出さずにコンパイルしてくれた。
とはいえ、本来サポートしている規格を指定しておくのが無難だと思う。

*1:gccのオプションに-std=c95は無い(と思う)

*2:条件付きコンパイルで当該関数のプロトタイプ宣言が除かれる