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

#define fun(name0, name1, x, y) name0##_##name1(x, y)
// ##=> 붙여준다.
// add_int(x, y)
#define out_int(name0, name1, data) printf(#name0"_"#name1" : [%d ]\n", data)
#define out_float(name0, name1, data) printf(#name0"_"#name1" : [%f ]\n", data)
// #=>문자열을 만들어준다.
// printf("add""_""int"" : [%f ]\n", data) 문자열이 2개 중복으로 나올경우 삭제됨
// printf("add_int : [%f ]\n", data)
#define out(name0, name1, data) out_##name1(name0, name1, data)

int add_int(int x, int y) { return (x+y) ; }
int sub_int(int x, int y) { return (x-y) ; }
int mul_int(int x, int y) { return (x*y) ; }
int div_int(int x, int y) { return (x/y) ; }

float add_float(float x, float y) { return (x+y) ; }
float sub_float(float x, float y) { return (x-y) ; }
float mul_float(float x, float y) { return (x*y) ; }
float div_float(float x, float y) { return (x/y) ; }

void main()
{
        int a = 100, b = 20, c ;
        float fa = 50.2, fb = 20.4, fc = 0.0 ;
       
        c = fun (add, int, a, b) ;      out(add, int, c) ;
        c = fun (div, int, a, b) ;      out(div, int, c) ;
        c = fun (mul, int, a, b) ;      out(mul, int, c) ;

        fc = fun(add, float, fa, fb) ; out(add, float, fc) ;
        fc = fun(div, float, fa, fb) ; out(div, float, fc) ;
        fc = fun(mul, float, fa, fb) ; out(mul, float, fc) ;
}