fetus Diary
2006/12/11(月) - 引数リストの void を省略すべきか
ネタもとがどこかはあえて書かない :-P
どこぞで、C++ の関数(またはメソッド)宣言、定義において引数が無い場合に int hoge() とすべきか int hoge(void) とすべきかで議論されているけども、個人的には「書くな」派。なぜなら、引数リストが空である事が重要だし、void 型の引数を取るように見えるから。
実際には、void 型っていうのが存在しないのは(C/C++ プログラマにとっては)自明だけども、void* 型ってのは有るしね。あんまり薦められた型では無いけど、fread や fwrite の引数は void* 型/ const void* 型ってのが一番適合する気がする。もっとも、それについても「ストリーム使え」って言われたら言い返せないけど、ストリームの定義するの面倒くさいし。あと、memset とか memcpy もそうだよね。いちいち char* 型にキャストとかアホらしいし、そもそもキャストすべきでない(void* で受け取った後にポインタ操作のために char* にキャストする*1のはまぁ、いいけど)し。
…とはいえ、戻り値の void は省略できないのでまぁ、非対称といえば非対称なんだけど。
*1: 例えば、こんなの。
void * memset(void *target, int c, size_t size) {
unsigned char *begin = static_cast<unsigned char *>(target);
unsigned char *end = begin + size;
for(unsigned char *it = begin; it != end; ++it) {
*it = static_cast<unsigned char>(c);
}
return target;
}
※テストしてないのでバグってるかも。
ところで、memset の第二引数って、何で int なんだろう。1 バイト = sizeof(char) = sizeof(unsiged char) の保証が無いから?
- 06/12/11
14:5515:21
コメント
コメントはありません。