Я переношу старую библиотеку C++, большая часть кода которой старше 20 лет. Я наткнулся на объявление структуры, которое, как мне кажется, должно быть конструктором, который выглядит так:
struct PROPERTIES_PRESENT2
{
bool PropertyPresence[13];
struct PROPERTIES_PRESENT2(void)
{
memset((&PropertyPresence), 0, (sizeof(bool) * 13));
}
};
Сегодня это не компилируется современными компиляторами. Я думаю, что смогу заставить это работать, удалив «структуру» перед конструктором. Но я надеюсь на помощь: требовали ли старые стандарты C++ «структуру» перед конструктором, как показано выше? И может ли кто-нибудь подтвердить, что поведение действительно было поведением конструктора, а не какой-то давно забытой вещи с побочными эффектами, о которых мне следует знать?
Моя «переделанная» версия:
struct PROPERTIES_PRESENT
{
bool PropertyPresence[13];
PROPERTIES_PRESENT(void)
{
memset((&PropertyPresence), 0, (sizeof(bool) * 13));
}
};
Возможно, было бы полезно узнать, для какого компилятора это было изначально написано, учитывая, что это, должно быть, была предварительная стандартизация.
Я никогда не видел struct
обязательным (или разрешенным) в конструкторе. Я начал программировать на C++ в 1990 году, используя SAS/C++, Lattice C++, Comeau C++, Turbo C++. Может быть, раньше...?
На самом деле это похоже на некую форму «Objective-C++» (смешанный язык Objective-C\C++). В этот момент семантика кода находится под большим вопросом.
Поскольку имя написано заглавными буквами, есть ли вероятность, что это макрос будет расширен во что-то еще?
Обратите внимание, что «устарело» — это технический термин в стандарте C++; это означает, что эта функция может исчезнуть в будущем. Этот синтаксис никогда не был легален в C++, поэтому нечего осуждать.
требовали ли старые стандарты C++ «структуру» перед конструктором, как показано выше?
Нет, синтаксис ISO C++ никогда не был правильно сформированным.
Я никогда не видел этот синтаксис, поэтому, к сожалению, не могу ответить на остальную часть вопроса.
Современная версия, если вы правильно определили язык, будет такой:
struct PROPERTIES_PRESENT
{
bool PropertyPresence[13] = {};
};
Обновлено: Из современных компиляторов Visual Studio это принимает даже последняя версия v.19 (https://godbolt.org/z/Ts461qM74). Это их стиль с ранних времен, примерно с VisualStudio 1.0–2.0.
Новая версия может быть
struct PROPERTIES_PRESENT { bool PropertyPresence[13]{}; };