Как все говорят, вы можете использовать вставку токенов для создания имени в макросе, поместив ##
там, где необходимо объединить токены.
Если препроцессор поддерживает макросы с переменным числом, вы можете включить returnсписок типов и параметров тоже:
#define GENERATE_FUNCTION(RET,NAM,...) RET func_##NAM(__VA_ARGS__)
.. так, например:
GENERATE_FUNCTION(int,SomeClass,int val)
.. расширится до:
int func_SomeClass(int val)