Hi,
The Bottom line is #defines are a simple TEXT SUBSTITUTION mechanism and what their types are is dependent on where the text is substituted.
Most likely
#define BAUD 9600
is will be used integer in the code
#define PASSWD "passwd"
will be used in place of a char[] in the code.
#define PI 3.14
will probably be used as a float. however if it all depends on where you use it.
printf("The Baud is %d\n",BAUD );
will become
printf("The Baud is %d\n",9600 );
and the compiler would allow this. It will be an integer however
printf("The Baud is " #BAUD "\n"

;
will be translated as a string
printf("The Baud is " "9600" "\n"

;
now if you had
#define PARITY 8N1
and tried
printf("Parity is %s\n", PARITY);
this would translate to
printf("Pariry is %s\n", 8N1);
and the compile would flag this as an error because 'N' is not a number. however
printf("Parity is %s\n", #PARITY);
this would translate to
printf("Pariry is %s\n", "8N1"

;
and that is perfectly fine.
----