2012年現在のC言語コンパイラでもK&R Cソースコードを扱えるか試したのでメモ。*1
結論:gccとMSVCはK&R Cソースコードでもコンパイル可能。
/* K&R style C */ int printf(); int add(); main(argc, argv) int argc; char** argv; { printf("1+2=%d\n", add(1, 2)); return 0; } add(x, y) { return x + y; }
gcc系
gcc 4.7.1, 4.6.3にて正常にコンパイル&実行可能なことを確認*2。
$ gcc input.c -fno-builtin
$ gcc input.c -fno-builtin -Wall -W -Wextra input.c:5:1: warning: return type defaults to 'int' [-Wreturn-type] input.c: In function 'main': input.c:6:7: warning: unused parameter 'argc' [-Wunused-parameter] input.c:7:10: warning: unused parameter 'argv' [-Wunused-parameter] input.c: At top level: input.c:13:1: warning: return type defaults to 'int' [-Wreturn-type] input.c: In function 'add': input.c:13:1: warning: type of 'x' defaults to 'int' [-Wmissing-parameter-type] input.c:13:1: warning: type of 'y' defaults to 'int' [-Wmissing-parameter-type]
Visual C++系
MSVC9, MSVC10にて正常にコンパイル&実行可能なことを確認*3。MSVC10にて警告レベル4(/W4)指定時の出力は次の通り。
input.c(6): warning C4131: 'main' : 旧スタイルの宣言が使われています。 input.c(6): warning C4431: 型指定子がありません - int と仮定しました。 メモ: C は、現在 int を既定値としてサポートしていません input.c(11): warning C4100: 'argv' : 引数は関数の本体部で 1 度も参照されません。 input.c(11): warning C4100: 'argc' : 引数は関数の本体部で 1 度も参照されません。 input.c(14): warning C4131: 'add' : 旧スタイルの宣言が使われています。 input.c(14): warning C4431: 型指定子がありません - int と仮定しました。 メモ: C は、現在 int を既定値としてサポートしていません
*1:余談:Boost.勉強会 #10の全員参加ディスカッションにて、「K&R Cで書かれた古いソースをMicrosoft Visual C++で普通にコンパイルできた」と小耳にはさんだので気になり確認。
*2:オプション -fno-builtin を外すと "warning: conflicting types for built-in function 'printf' [enabled by default]" が出力される。
*3:ソースファイル拡張子を .c にしておくか、コンパイル言語の選択にて "Cコードとしてコンパイル(/TC)" を指定する必要がある。既定の警告レベル3(/W3)では全くWarningが出力されない。