The output of the preprocessor is tokens, not plain text. Unless you use the token pasting operator, tokens are not normally combined in preprocessing.
When you view the output of the preprocessing step, you have to convert the tokens to text. gcc inserts the space so you are not mislead into thinking that tzsW
is a single token. It doesn't need to do this in the tzs[
case as [
isn't a valid identifier character so there's no confusion.
Both compilers are correct in not treating tzsW
as a single token to be re-expanded.
Note that the Visual C++ documentation acknowledges that compiling the output of the preprocessor may produce different and incorrect output compared with compiling the original source due to the fact that they don't insert whitespace to delimit tokens when converting the preprocessed output to text. This doesn't happen when the preprocessor output is passed straight to the next stage of the compiler in normal operation.