В C ++ 11 что должно произойти в первую очередь: расширение необработанных строк или макросы?

Этот код работает в Visual C ++ 2013, но не в gcc / clang:

#if 0
R"foo(
#else
int dostuff () { return 23; }
// )foo";
#endif
dostuff();

Visual C ++ сначала удаляет if 0. Clang сначала расширяет необработанную строку R (и никогда не определяет dostuff). Кто прав и почему?

39

Решение

GCC и Clang правы, VC ++ не прав.

2.2 Фазы перевода [lex.phases]:

[…]
  1. Исходный файл разлагается на токены предварительной обработки (2.5) и последовательности символов пробела (включая комментарии).

  2. Директивы предварительной обработки выполнены, […]

А также 2.5 Токены предварительной обработки [lex.pptoken] списки string-literals среди жетонов.

Следовательно, синтаксический анализ необходим для токенизации строкового литерала в первую очередь, «потребляя» #else а также dostuff определение функции.

33

Другие решения


По вопросам рекламы [email protected]