Я знаю два распространенных способа борьбы с такой ситуацией в C.1) Замените int и "char *" на "void * p" и "int size"
void f1(int i); void f2(char *str); -> void f(void *p, int s);
f(&i, sizeof(i)); f(str, strlen(str);//or may be f(str, sizeof(str[0]);
, например, см. qsort из stdlib
2) Использовать препроцессор, например
#define f(arg) do { \
//magic
} while (0)
, например, для эмуляции std:: список в ядре Linux.