Как выполняется замена макроса в сложных ситуациях?

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

#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 прекрасно его компилирует.

5
задан Brian Tompsett - 汤莱恩 16 March 2016 в 21:41
поделиться