Cで文字列を反転させる再帰関数

Cで文字列を反転させる関数を再帰を使って書け、という問題をふと思い出して書いてみた。久しぶりにCを書くと一発でコンパイルが通らなかったりする。で、プロトタイプ宣言なしだと、小粒の関数から順に並べないとダメだったりして、どうも気持ち悪い。抽象度の高い関数があって、その実装は実はこうだよ、ここではこれこれはこういう意味で使ってるよという風に「高->低」と定義していくほうが自然な気がする。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap_chars (char *s, char *e) {
  char tmp;
  if (s >= e) return;
  tmp = *e;
  *e = *s;
  *s = tmp;
  *s++; *e--;
  swap_chars(s, e);
}

void reverse (char *str) {
  int len = strlen(str);
  swap_chars(str, str + len - 1);
  return;
}

int main (int argc, char *argv[]) {
  if (argc <= 1) {
    printf("give me a string\n");
    exit(1);
  }
  char *str = argv[1];

  reverse(str);
  printf("%s\n", str);
  return 0;
}