Hi Eljay, Can you comment more on the below statement " You cannot token paste X substitution argument conjoined to . (dot). That does not form a token, it forms two tokens." Since I tried a sample program in Microsoft Visual Soft C++ #define SET_STR_OUTPUT(X, Y) str ## X ## .str ## Y ## Var typedef struct { char str1Var; char str2Var; char str3Var; }str; Void main() { str str1, str2, str3; SET_STR_OUTPUT(1, 1) = 5; printf("%d\n", str1.str1Var); } And it worked fine and the output is displayed as 5. Thanks & Regards Vishnu -----Original Message----- From: John (Eljay) Love-Jensen [mailto:eljay@xxxxxxxxx] Sent: Wednesday, March 24, 2010 6:12 PM To: Beema, Vishnu (IE10); gcc-help@xxxxxxxxxxx Subject: RE: Token-Pasting Operator (##) Hi Vishnu, To use token pasting preprocessor operator, you must be pasting a token and a token to form a single new token. You cannot be pasting two token together. #define DO_SET_1(X, Y) PORT ## X ##.OUTSET = PIN ## Y ## _bm DO_SET_1(D, 0); I am going to list out the expansion with one token per line: PORTD . OUTSET = PIN0_bm Notice in your macro you have this token pasting: X ## . You cannot token paste X substitution argument conjoined to . (dot). That does not form a token, it forms two tokens. If you change your #define macro to: #define DO_SET_1(X, Y) PORT ## X .OUTSET = PIN ## Y ## _bm Then you will no longer be trying to form an invalid token paste between X and . (dot). Sincerely, --Eljay