sizeofは先進的すぎる
Hacker News経由。sizeofの不思議な挙動が話題になっていた。
Humans should think of sizeof() as a function, says Linus Torvalds (lkml.org)
でもsizeofを関数として扱えというのも微妙で、ちゃんとoperatorとして扱うのが正解じゃないかな。
sizeof operator
サンプル
int main(){
int a = 0;
printf("%zu\n", sizeof (a) + 1);
printf("%zu\n", sizeof (a + 999) + 1);
}
この二つは両方とも出力は5になる。これでもsizeofを関数として扱えというのは無理がある。
cの世界にあってこのsizeofは飛び抜けたセンスを光らせていて、引数に型と式を受けることができる。
カッコをつけると型として扱われるからカッコの中で+999なんてやっても無視される。(ビルド警告さえ出ないのはひどい)
考えようによってはsizeofはc唯一のジェネリック関数であって超かっこいいのかもしれない。
名前も珍しく普通に読める。returnとかmainなどと共に数少ない良質な名前だ。sizeだけじゃなくてofがついているのも近未来的。
一番ひどいのはリーナスで
I don't want you writing kernel code.
とキツイニュアンスで相手の人格を全否定に入っている。こんなことを言われた人の気持ちも大切であろう。
ところでsizeofの戻りはsize_tだけど、それをprintfするときに%zを使うべきなのだそうだ。
how-to-print-size-t-variable-portably
‘z’ was introduced in ISO C99. ‘Z’ is a GNU extension predating this addition and should not be used in new code.
こういう不毛なことを避けるためにもリーナスはさっさとLinuxをRustで書けよと誰か言ってやって欲しい