Здесь играет роль порядок расширения, сначала расширяется макрокоманда, затем внутренние. В первом случае после расширения MACRO_COMBINE_INNER
вы получите:
ABC##__LINE__
, что превращается в ABC__LINE__
, потому что __LINE__
здесь не является отдельным токеном. Во втором случае препроцессор расширяется MACRO_COMBINE(ABC,__LINE__)
, затем __LINE__
расширяется. `
MACRO_COMBINE_INNER(ABC,123)
А затем MACRO_COMBINE_INNER
расширяется
ABC##123
Существует аналогичное поведение с оператором stringify, который требует создания макроса, подобного этому
#define STRINGIFY(x) #x
#define STRING(x) STRINGIFY(x)
To уметь использовать __LINE__
в строковом литерале:
#define THROW_BAD_INDEX(x) throw std::out_of_range \
(__FILE__ ":" STRING(__LINE__) ": Bad index")