Endows (8644) の日記
2003 年 04 月 18 日
午後 11:56
Endows の へっぽこプログラマ日誌 第6.1回
ありゃ。
gcc でも普通にコンパイラ通りました。
出力はやはり int のサイズである 4 。
謎は深まるばかりである。
解釈が間違っているのか…?
『我こそは C ウィザード』という方、読んでいらっしゃったらこの疑問についてお答えください…。
この議論は賞味期限が切れたので、アーカイブ化されています。
新たにコメントを付けることはできません。
どうやら (スコア:1)
ソースを書き換えたりしてエラーメッセージなどを見た結果、どうやら
sizeof(main) がダメで、
sizeof(main()) は OK ということらしい。
いまいち理解度が十分でないが、今のところはそういうことで結論としておこう。
なんか面白そうだったので (スコア:1)
--- テストコード ---
#include
double func(void)
{
return 0.0;
}
int
main(void)
{
double *ptr = NULL;
double (*func2)(void) = func;
printf("sizeof(func) = %d\n",sizeof(func));
printf("sizeof(func()) = %d\n",sizeof(func()));
printf("sizeof(func2) = %d\n",sizeof(func2));
printf("sizeof(func2()) = %d\n",sizeof(func2()));
printf("sizeof(ptr) = %d\n",sizeof(ptr));
printf("sizeof(*ptr) = %d\n",sizeof(*ptr));
return 0;
}
--- ここまで ---
--- 結果 ---
sizeof(func) = 1
sizeof(func()) = 8
sizeof(func2) = 4
sizeof(func2()) = 8
sizeof(ptr) = 4
sizeof(*ptr) = 8
--- ここまで ---
うーん,確かにsizeof(func)だとおかしな結果になってますねぇ.
関数のポインタ型ということで他のポインタ型と同じ値が返ってくると
思っていたのですが.1が返ってくるとは意外でした.
一方で,"関数のポインタ"として宣言されていれば,
sizeofもちゃんとわかるみたいですね.
まぁsizeof(func())は一応それっぽい値を返すみたいですけど,
個人的にはあんまり使わない方がいいんじゃないかなーと思います.
Re:なんか面白そうだったので (スコア:1)
同じソースコードを Windows 上の Borland C++ Compiler 5.5.1 でコンパイルしてみると、sizeof(func) のところで『sizeof は関数に適用できない』のエラーがでてコンパイルできませんでした。
1つ前の日記の自己コメント [srad.jp]にある『関数型』というのは main や func の型で、 main() や func() の型はあくまでもその関数の返す型ということなのかな、と思っています。 (理解度が足りない、と書いたのは、ソース中で func と書いたとき、それが何を示すのかちゃんと分かりきっていないということからです。)
Re:なんか面白そうだったので (スコア:1)
もちっと試してみました。
sizeof(func2) は、 func2 がポインタなのでアドレスを格納するのに必要なサイズ
sizeof(*func2) は、func2 が示す先が関数なのでエラー
ということみたいです。