Подсмотрел у коллеги простой и довольно удобный способ держать список состояний/событий конечного автомата в одном месте. А то обычно они норовят расползтись по разным углам: enum, объявляющий соответствующие константы, массив имен состояний для отладки, большой switch, выбирающий что делать, в зависимости от состояния…
Read more…
… но я понятия не имел, что вложенные структуры в C/C++ можно инициализировать плоским списком значений. Есть, например, вот такая структура:
struct foo {
int value;
};
struct bar {
int value;
};
struct foobar {
foo value1;
bar value2;
int value3;
};
Её можно инициализировать вот так:
foobar data = { { 1 }, { 2 }, 3 };
А можно и так:
foobar data = { 1, 2, 3 };
Компилятор съест оба варианта кода и не поморщится.
PS. Ну а чё, – эксперт в C, больше десятка лет в индустрии, то-сё.
На днях пытался понять, отчего и почему крошечное приложение пухнет как на дрожжах при добавлении некоторых библиотек из Boost. Рассматривая сгенерированный map файл, выяснил, что утилита undname.exe поставляется вместе с Visual Studio и в состав Windows SDK не входит. Пришлось написать свою – там всего-то нужно вызвать одну функцию (UnDecorateSymbolName). По ходу дела нашел несколько интересных ссылок по теме:
- Схема, по которой кодируются имена:
- Tips: Visual C++ – упоминает, что UnDecorateSymbolName не умеет декодировать имена классов. Вместо неё предлагается использовать недокументированную функцию, предоставляемую самим компилятором – _unDName. Вот аналогичная жалоба на rsdn.ru.
- Исходный код _unDName из проекта Wine
Разница между UnDecorateSymbolName и _unDName меня совсем не удивляет. Эти функции происходят из двух разных проектов. UnDecorateSymbolName (dbghelp.dll) – это реализация из WinDbg (Windows Division). _unDName (msvcrt.dll) пишут разработчики компилятора (DevDiv). К счастью, новые версии WinDbg выходят гораздо чаще, чем новые версии Visual C++. Есть шанс, что найденные ошибки будет оперативно подправлены.
Вот код, которым я пользуюсь для написания стресс тестов и фаззеров в своих проектах. Класс EntropyGenerator – обертка вокруг генератора случайных чисел.
Read more…
В последнее время я немного забросил Win32.Utf8 – на работе завал, так что, приходя домой, делать ничего особенного не хочется. Тем не менее, проект потихоньку движется и, на сегодняшний день, я добрался до разбора SAL аннотаций.
Read more…
Я как-то упустил из виду. Похоже, что Boost наконец-то переехал в Subversion репозиторий, а баги теперь ведутся в Trac. Давно пора.
Наткнулся на забавную вещь. Вот такой код спокойно компилируется GCC (версия 3.4.2 (mingw-special)):
#include <stdio.h>
int main()
{
void* ptr;
printf("sizeof(void): %d\\n", sizeof(void));
ptr = 0;
printf("before increment: %p\\n", ptr);
ptr += 1;
printf("after increment: %p\\n", ptr);
return 0;
}
Read more…
Recent Comments