Этот код работает в Visual C ++ 2013, но не в gcc / clang:
#if 0
R"foo(
#else
int dostuff () { return 23; }
// )foo";
#endif
dostuff();
Visual C ++ сначала удаляет if 0. Clang сначала расширяет необработанную строку R (и никогда не определяет dostuff). Кто прав и почему?
GCC и Clang правы, VC ++ не прав.
2.2 Фазы перевода [lex.phases]:
[…]
Исходный файл разлагается на токены предварительной обработки (2.5) и последовательности символов пробела (включая комментарии).
Директивы предварительной обработки выполнены, […]
А также 2.5 Токены предварительной обработки [lex.pptoken] списки string-literals
среди жетонов.
Следовательно, синтаксический анализ необходим для токенизации строкового литерала в первую очередь, «потребляя» #else
а также dostuff
определение функции.