On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 20:03. Заголовок: Баг стандарта С++ 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__ отсутствует.

#include <iostream> 

int main()
{
std::cout << '\"' << __func__ << "\"\n";
}


Естественно напрашивается вывод о том, что это баг компилятора 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 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 10
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет