Может быть, программисту, написавшему функцию, не понравится синтаксис приведения ...
foo(to_uchar(ch)); /* function call */
foo((unsigned char)ch); /* cast */
Но я все равно позволю компилятору позаботиться об этом:)
void foo(unsigned char);
char s[] = "bar";
foo(s[2]); /* compiler implicitly casts the `s[2]` char to unsigned char */