netch80: (Default)
[personal profile] netch80
Перевожу застарелый сишный код на 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 обходит инициализацию переменных, низзя!"

(Понятно, что это всё следы быстрого перехода и дальше будут вычищены. Речь не о том.)
(will be screened)
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

netch80: (Default)
netch80

January 2026

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

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 12:09 pm
Powered by Dreamwidth Studios