среда, 25 августа 2010 г.

За что я люблю C++

Праздник отладки:

В С++ (и в С) есть замечательный оператор: ,
Он возвращает свой последний аргумент.

У меня в коде была такая конструкция:


namespace
{
const unsigned int BuffSize = 15;
}

int parse()
{
const unsigned char buff[BuffSize];
//...
std::string name = std::string(reinterpret_cast<const char *>(buff, BuffSize));
}
_Winnie C++ Colorizer


При этом программа падала в различных местах, было пересмотрено куча подозрительных мест, найдено множество других ошибок, но эта ошибка так и не исчезала.

Этот проект собирается под win32 и sparc solaris, под виндой - msvc 2008, под соляркой - gcc 4.2.1. Также для тестов компиляции он собирается под mingw32-g++ 4.4.

В студии проект собирался с /W4, под gcc с -Wall.

Перепробовав все, я решил включить в gcc -Wextra и -pedantic.

Среди кучи варнингов я заметил вот этот: warning: left-hand operand of comma has no effect. Посмотрев в коде я увидел как раз указанную выше конструкцию.

Соответственно, оператор "запятая" возвращал последний операнд.

В гугле по запросу C++ comma operator выдал сразу пояснение:


a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!