Как выполняется замена макроса в сложных ситуациях? - PullRequest
5 голосов
/ 08 июля 2011

Рассмотрим следующий пример кода.

#define T(q) L##q
#define A(p) T("x" T(#p))
wchar_t w[] = A(a);

Правильно ли сформирован этот код?Какова стоимость w?Отличается ли поведение в C и C ++?Отличается ли он в C ++ 0x?

Я просмотрел стандарт C ++ 03 и мне кажется, что код должен быть действительным, если w имеет значение L"xa".

  1. Обнаружен вызов A, обработка которого дает последовательность pp T ( "x" T ( "a" ) ).
  2. Обнаружен вызов T, получен L ## "x" T ( "a" ), что, в свою очередь, дает L"x" T ( "a" ).
  3. Обнаружен вызов T, что дает L"x" L"a".

Это правильно?Ни EDG, ни Clang не принимают этот фрагмент, MSVC 9 прекрасно его компилирует.

1 Ответ

4 голосов
/ 08 июля 2011

г ++ расширяется до

L"x" T("a")

Макрос не может быть рекурсивным, и они предварительно обрабатываются только в одном кадре, поэтому T(#p) больше не будет расширяться. Если вы хотите L"xa", то можно сделать следующее:

#define A(p) T("x")#p
#define T(q) L##q

(На самом деле L"x""a".)

...