For better understanding the concept behind this question, i changed the question as
before going to compilation, our source program goes through the preprocessors, at preprocessor stage all macros are substituted in the program.
starts from line 1... at line 2, preprocessor understood that a macro is defined int as type. ( Simply saying it forms a association between type and int. )
therefore from the line 3 ( in source code ), it simply just replace the the text type with int.
===> line 3 looks as int foo1(int b)
at line 7, preprocessor understood that a macro is undefined int as type., it means from here onwards there is no association between type and int.
at line 8, preprocessor understood that a macro is defined float as type. ( Simply saying it forms a association between type and float. )
therefore from the line 9 ( in source code ), it simply just replace the the text type with float.
===> line 9 looks as float foo2(float b)
after the phase of preprocessor stage, our code will look like as
from here onwards it is very straight forward that
foo1 takes integer as argument ===> variable b of foo1 function value assigned as 1 ===> return (1*1) = 1 ==> stored in the variable a of main function.
foo2 takes float as argument ===> variable b of foo2 function value assigned as 1.1 ===> return (1.1*1.1) = 1.21 ==> stored in the variable b of main function.