четверг, 4 ноября 2010 г.

Динамическая типизация в С++

Если открыть любую книгу по программированию на С++, то почти наверняка найдем высказывание о том, что C++ - язык со статической типизацией. Статическая и динамическая типизация - взаимоисключающие понятия, если есть одно, то не может быть другого. Однако, вспомним, что в C++ есть шаблоны, а также есть шаблонное метапрограммирование (template metaprogramming).

воскресенье, 31 октября 2010 г.

Парсер csv

Недавно мне понадобилось парсить файл формата csv. При этом каждый элемент соответствует некоторому полю структуры, например:
Содержимое файла csv:
some string,1,some string 2,100500
hello, 2,good bye,111111

Структура, которую необходимо заполнить:
struct some_struct
{
    std::string name1;
    int count1;
    std::string name2;
    int count2;
};
_Winnie C++ Colorizer
Используем для этих boost:
Нам понадобятся две библиотеки: tokenizer и lexical_cast

воскресенье, 24 октября 2010 г.

Приемы программирования. Part 1

Язык C
Как писать функции, безопасные с точки зрения утечки ресурсов.
Под ресурсами понимаются открытые файлы, сокеты, хэндлы, выделенная память.

Наша функция должна работать с ресурсом (читать из него, писать в него), при этом количество точек выхода из функции велико, если вдобавок мы работаем с несколькими ресурсами (например перекладываем данные из двух файлов в один по некоторому алгоритму), то становится очень сложно следить за всеми ресурсами. Если же мы модифицируем алгоритм (например, добавляем еще один ресурс), то во все точки выхода придется добавлять закрытие этого ресурса, к тому же постоянное повторение одних и тех же фрагментов понижает читабельность кода

среда, 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!