Добрый вечер! Необходимо реализовать полностью без CRT.
{
STARTUPINFO SI;
ZeroMemory(&SI, sizeof(STARTUPINFO));
}
В данном коде, необходимо заполнить SI нулями. С CRT сделать это можно с помощью memset или ZeroMemory(которому тоже нужен memset). Мне эти два варианта не подходят, как можно сделать это без поддержки CRT?
Сработает ли, если я просто объявлю SI таким способом? Спасибо.
STARTUPINFO SI[sizeof(STARTUPINFO)]{0};
Со времен классического С в языке есть идиоматический Универсальный Нулевой Инициализатор { 0 }, который может использоваться для инициализации нулем/нулями вообще чего угодно. В вашем случае
STARTUPINFO SI = { 0 };
В языке С++, в силу ряда С++ тонкостей, вариант { 0 } не всегда применим, а его роль выполняет инициализатор {}
STARTUPINFO SI = {};
Разумеется, в С++ все это будет работать как нулевой инициализатор только если класс не определяет своих конструкторов.
Отдельно можно заметить, что синтаксис {} инициализирует объект-приемник логическими значениями 0, внутреннее физическое представление которых не обязано состоять из набора нулевых битов. А memset и ZeroMemeory как раз таки наоборот, физически обнуляют память, забивая ее нулевыми битами. Так что в общем случае стоит подумать о том, что именно вам нужно.
Так
STARTUPINFO SI[sizeof(STARTUPINFO)]{0};
вы пытаетесь объявить целый массив STARTUPINFO.
Объявите просто
STARTUPINFO SI{ 0 };
Только вот тот же VC++ 2015, если посмотреть ассемблерный код, все равно при таком обнулении вызывает memset. Просто невидимо для вас.
В современных версиях C++ (тестировал на VS 2017) можно ещё проще:
STARTUPINFO SI { };
Требуемый в некоторых старых компиляторах ноль больше не нужен.
Как вариант, можно использовать placement new:
new(&SI)char[sizeof(SI)]();
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости