«前の日記(2012-03-01) 最新 次の日記(2012-03-16)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

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;
 }

と書き換えてやるといいのかな。本当の意図はプログラムを書いた人じゃないとわからないけど。

本日のツッコミ(全1件) [ツッコミを入れる]
Σ ゆきみみ屋 (2013-08-27 18:12)

いまさら突っ込みですがー<br>プログラムの終了コードと関数の戻り値は違うと思いますよ。<br>試すなら:<br>int test() { return; }<br>int main() { int i; i = test(); printf("%d\n", i); }<br>ってきちんと書いたほうがいいです。<br>で、省略時の戻り値は 255ではなく 0になるです。