non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

俺がふと思い立ち古いコードをビルドしようとして学んだこと

はじめに

この記事は、@kjunichiの2014年パーソナルアドベントカレンダーの4日目の記事です。

ふと思い立ちDockerでUbuntuを動かし、古いソースをビルドしようとして学んだことを記事にした。

gccなら怒られないとおもったコードだったが

最近はclangだとエラーメッセージは丁寧なものの、チェックは厳しいのですが、gccなら安心、古いコードならなおさらgccならやってくれると信じていたが、どうやら俺の知ってるgccも月日が流れ、サポートを止めてしまった為に、目的のコードのコンパイルが失敗した。

/usr/lib/gcc/x86_64-linux-gnu/4.8/include/varargs.h:4:2: error: #error "GCC no longer implements ."
 #error "GCC no longer implements ."
  ^
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/varargs.h:5:2: error: #error "Revise your code to use ."
 #error "Revise your code to use ."
  ^

可変引数を扱う古いコードを何とかするには

stdarg.hを使うように変更

-#include <varargs.h>
+#include <stdarg.h>

va_alistは「...」(ピリオド三つ)にし、va_dclは削除

-PSprintf(format, va_alist)
-    char* format;
-    va_dcl
+PSprintf(char *format, ...)

va_startnoの第二引数に第一引数で渡されたパラメータを追加

-    va_start(args);
+    va_start(args, format);

Link