Oct. 13th, 2021

netch80: (Default)
Перевожу застарелый сишный код на C++. Самые неприятные чудеса:

1. Designated initializers - это типа struct moo { .a = 1, .b = 2 } - не поддерживаются, C++ сторона не смогла такое согласовать. Из g++ выкинули и ввели снова уже только ближе к C++20.
Приходится записывать все значения с их умолчаниями явно.
Попытался вырулить это через конструктор с параметрами - как-то не работает.
Самое неприятное, что на массив на полсотни таких структур жалобы идут на последнюю строчку всего массива - дальше разбирайся сам. Лечится через #if 0 и смещение его по мелким кусочкам.
1ʹ. Потерялась возможность писать конструкции типа sig_action = (struct sigaction) { .sa_handler = usr1signal };.

2. Если битовые маски были объявлены через enum, типа enum moo { COW = 1, DOG = 2 }, то в flags &= ~DOG; требуется раскрытие операции и явное приведение к moo в присвоении. Тут уже просто обидно (кажется, в C# пометив enum как битовые маски можно уйти от подобных проблем).

3. Инициализация структуры внутри другой структуры без квалификации области видимости. Основной туман возникает на записях типа LIST_HEAD(moo, moo_params) params.

4. Ну естественно куча присвоений типа frx = calloc(1, sizeof(*frx)). GCC добавляет сюда адресную арифметику для void*.
К calloc() ещё вопрос - если я перейду на new/make_unique/etc., memset вроде по-прежнему допустим, но некрасиво.

5. Ошибки типа "goto обходит инициализацию переменных, низзя!"

(Понятно, что это всё следы быстрого перехода и дальше будут вычищены. Речь не о том.)

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 10:03 am
Powered by Dreamwidth Studios