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) の保証が無いから?

コメント

コメントはありません。

名前
メール
コメント

※HTML タグは使えません。HTTP URL には自動リンクが張られます。

Captcha
画像から読み取れる文字を入力: