you're mixing ANSI prototypes and the original style, and in void f(b) char b; i suspect b is promoted to int, because before prototypes C compilers didn't know an argument was a char at point of call, and chars were promoted to int (similarly float to double), and the function with the argument so promoted clashes with the earlier void f(char). in any case, if you're going to use 8c at all, just commit to ANSI prototypes. in fact, even if you're not going to use 8c, just use ANSI prototypes and either way, avoid or eliminate the ARGS crud. surely it must be at least 20 years old. if the code is imported i suppose it doesn't matter, but if it's new code, using ARGS or __PROTO or whatever is usually just silly.