(no subject)
Oct. 13th, 2021 08:26 pmПеревожу застарелый сишный код на C++. Самые неприятные чудеса:
1. Designated initializers - это типа
Приходится записывать все значения с их умолчаниями явно.
Попытался вырулить это через конструктор с параметрами - как-то не работает.
Самое неприятное, что на массив на полсотни таких структур жалобы идут на последнюю строчку всего массива - дальше разбирайся сам. Лечится через #if 0 и смещение его по мелким кусочкам.
1ʹ. Потерялась возможность писать конструкции типа
2. Если битовые маски были объявлены через enum, типа
3. Инициализация структуры внутри другой структуры без квалификации области видимости. Основной туман возникает на записях типа
4. Ну естественно куча присвоений типа
К calloc() ещё вопрос - если я перейду на new/make_unique/etc., memset вроде по-прежнему допустим, но некрасиво.
5. Ошибки типа "goto обходит инициализацию переменных, низзя!"
(Понятно, что это всё следы быстрого перехода и дальше будут вычищены. Речь не о том.)
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 обходит инициализацию переменных, низзя!"
(Понятно, что это всё следы быстрого перехода и дальше будут вычищены. Речь не о том.)