[hjl@gnu-cfl-2 asm]$ cat foo.S #define foo(symbol, type) \ foo_1(symbol, type) #define foo_1(symbol, s_type) \ .type symbol, %##s_type foo (xxx, object) [hjl@gnu-cfl-2 asm]$ gcc -c foo.S foo.S: Assembler messages: foo.S:6: Error: unrecognized symbol type "" foo.S:6: Error: junk at end of line, first unrecognized character is `o' [hjl@gnu-cfl-2 asm]$ gcc -E foo.S # 0 "foo.S" # 0 "<built-in>" # 0 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 0 "<command-line>" 2 # 1 "foo.S" .type xxx, % object [hjl@gnu-cfl-2 asm]$ Assembler doesn't expect space between % and object.