yohhoyの日記

技術的メモをしていきたい日記

古のK&R C in 2012

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が出力されない。