共通で使えるソースも試す(ワイド文字版)
前回は文字列をバイト列で扱ったが、
今回はワイド文字版で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
fwide
とwprintf
は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
でもコンパイラは警告一つ出さずにコンパイルしてくれた。
とはいえ、本来サポートしている規格を指定しておくのが無難だと思う。