The relevant part of the spec is:
6.10.3.1
"After the arguments for the invocation of a function-like macro have been identified,
argument substitution takes place. A parameter in the replacement list, unless preceded
by a # or ## preprocessing token or followed by a ## preprocessing token (see below), is
replaced by the corresponding argument after all macros contained therein have been
expanded."
In other words, when macro parameters are replaced, there is a round of macro expansion on the argument first, unless the parameter appears with # or ##.
So g(blah)
just stringifies blah
. h(blah)
first macro-expands blah
, then stringifies it.
The difference is particularly relevant when you want to stringify macro names:
printf("The value of the " g(NULL) " macro is " h(NULL));