расширение макроса в с ++ - PullRequest
1 голос
/ 31 марта 2020

Определите два макроса следующим образом:

#define MACRO_COMBINE_INNER(A,B) A##B
#define MACRO_COMBINE(A,B) MACRO_COMBINE_INNER(A,B)

Мы используем эти макросы

MACRO_COMBINE_INNER(ABC,__LINE__)
MACRO_COMBINE(ABC,__LINE__)

Если номер текущей строки равен 123, это LINE == 123, Почему результаты расширяются из двух макросов:

ABC__LINE__
ABC123

1 Ответ

2 голосов
/ 31 марта 2020

Здесь играет роль порядок расширения, сначала расширяется макрокоманда, затем внутренние. В первом случае после расширения 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...