第6回 コンパイラ実装会で出た話題です。
関数のサイズを取ろうとしたら1になりました。なぜ?
test.c
#include <stdio.h> int main(void) { printf("%d\n", sizeof(putchar)); return 0; }
実行結果
$ gcc test.c $ ./a.exe 1
int aへのポインタが&aであるように、putcharへのポインタは&putcharです。ANSI Cでは関数ポインタの代入や呼び出しで&や*が省略できますが、sizeof()では省略できません。本来sizeof(関数)は関数の中にあるバイナリのサイズになるはずですが、取得することに意味がないため1になるようです。
C++ではエラーになります。
$ g++ test.c test.c: In function 'int main()': test.c:4:34: error: ISO C++ forbids applying 'sizeof' to an expression of function type [-fpermissive]
関数ポインタのサイズを取得するには、前述のように&putcharとしてポインタを取ります。
test.c
#include <stdio.h> int main(void) { printf("%d\n", sizeof(&putchar)); return 0; }
実行結果
$ gcc test.c $ ./a.exe 4 $ g++ test.c $ ./a.exe 4