Форум » C/C++ » Баг стандарта С++ 2011. » Ответить

Баг стандарта С++ 2011.

Сыроежка: Оказывается баги не только бывают у компиляторов, но даже и у самого стандарта С++! Как говорится, даже на Солнце есть пятна. Один из таких багов стандарта С++ 2011 был мною обнаружен на днях. В параграфе №8 подраздела "8.4.1 In general" раздела "8.4 Function definitions" стандарта С++ 2011 написано следующее: "8 The function-local predefined variable __func__ is defined as if a definition of the form static const char __func__[] = "function-name "; had been provided, where function-name is an implementation-defined string...." Обратите внимание на дополнительный пробел в конце строкового литерала "function-name ". Если вывести на консоль эту предопределеннную переменную, как показано в примере, с помощью компилятора GCC 4.7.0, то можно убедиться, что завершающий пробел в генерируемом этим компилятором значении __func__ отсутствует. [pre2]#include <iostream> int main() { std::cout << '\"' << __func__ << "\"\n"; }[/pre2] Естественно напрашивается вывод о том, что это баг компилятора GCC 4.7.0. Но если глубже разобраться в этом вопросе, то окажется, что это не баг компилятора GCC 4.7.0, а баг стандарта С++ 2011! Почему справедливо такое утверждение? Дело в том, что эта предопределенная переменная сначала была введена в язык С стандартом С99. Вот выдержка из этого стандарта (параграф №1 раздела "6.4.2.2 Predefined identifiers"): "1 The identifier __func__ shall be implicitly declared by the translator as if immediately following the opening brace of each function definition, the declaration static const char __func__[] = "function-name"; appeared when function-name is the name of he lexically-enclosing function." Как видно, здесь нет завершающего пробела в конце символьного литерала. Так как в стандарт С++ 2011 эта предопределенная переменная была включена как раз для обеспечения совместимости с С на основе стандарта С99, который был принят еще 11 лет тому назад, то отсюда и вытекает, что это баг самого стандарта С++ 2011. То есть никакого завершающего пробела в символьном литерале не должно быть. Я написал об этом в [url=https://groups.google.com/a/isocpp.org/forum/#!topic/std-discussion/XwEPqUUvzTE]группу по обсуждению текущего стандарта ISO C++[/url] и там подтвердили, что это баг стандарта С++ 2011, вопрос о котором будет поставлен перед комитетом по стандартизации.

Ответов - 0



полная версия страницы