筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
OSS活動をご支援いただける方を募集しています
2012-03-11 C言語
■ GCC と LLVM Clang 動作の違い (戻り値を省略したreturn)
FreeBSD ではシステムのデフォルトコンパイラを GCC から LLVM Clang に置き換える方針なのだけど、 9.0-RELEASE 時点ではまだ完全に移行したわけではなく、ビルドできない port も多数存在する。
GCC ではコンパイルできて、LLVM Clang ではコンパイルできないコードの例として、 以下のようなものがある。
#include <stdio.h> int main(void) { return; }
このようなコードは GCC では warning だが、Clang では error となる。
$ gcc -Wall returntest.c -o returntest-gcc returntest.c: In function 'main': returntest.c:5: warning: 'return' with no value, in function returning non-void
$ clang returntest.c -o returntest-clang returntest.c:5:2: error: non-void function 'main' should return a value [-Wreturn-type] return; ^ 1 error generated.
このコードを Clang でコンパイルできるようにするには、int 型の関数に int 型の戻り値を与えてやる必要があるのだけど、 そもそも GCC でコンパイルしたときに、省略された戻り値に何が補われているのかわからないと困る。ので実際に実行して調べてみたところ…
$ ./returntest-gcc; echo $? 255
255らしい。ということで、GCC ではコンパイルできて Clang ではコンパイルできない上記のコードは、
--- returntest.c.orig 2012-03-11 01:29:07.981782622 +0900 +++ returntest.c 2012-03-11 01:29:13.600783049 +0900 @@ -2,5 +2,5 @@ int main(void) { - return; + return 255; }
と書き換えてやるといいのかな。本当の意図はプログラムを書いた人じゃないとわからないけど。
いまさら突っ込みですがー<br>プログラムの終了コードと関数の戻り値は違うと思いますよ。<br>試すなら:<br>int test() { return; }<br>int main() { int i; i = test(); printf("%d\n", i); }<br>ってきちんと書いたほうがいいです。<br>で、省略時の戻り値は 255ではなく 0になるです。