Как я могу эмулировать C ++ 26 Ошибочное поведение в более ранних версиях C ++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу эмулировать C ++ 26 Ошибочное поведение в более ранних версиях C ++?

Сообщение Anonymous »

c ++ 26 вводит «ошибочное поведение» для ненициализированных данных и вводит атрибут [[[Неопределенный]]] для восстановления поведения Pre-C ++ 26 по мере необходимости. Я хочу получить сопоставимое поведение, но я заблокирован более ранним C ++.

Код: Выделить всё

int result;
// ... other logic ...
if (happytimes) {
result = 0;
} else {
// TODO: handle the error and return errorcode().
}
// ... other logic ...
return result;
Clang выпускает предупреждение, потому что это! К сожалению, я сталкиваюсь с Linter, который настаивает на том, чтобы обеспечить безопасность и предсказуемость Pre-C ++ 26, что я всегда инициалирую свои переменные. Поэтому я изменяю свой код: < /p>

Код: Выделить всё

int result{};
// ... other logic ...
if (happytimes) {
result = 0;
} else {
// TODO: handle the error and return errorcode().
}
// ... other logic ...
return result;
А теперь Linter, , а также Clang , молчит. Но код все еще нарушен. Спасибо Линтер! В C ++ 26 Я мог бы оставить переменную ненициализированной и извлечь выгоду из проверки времени компиляции и гарантий безопасности времени выполнения. В коде Pre-C ++ 26 я мог бы инициализировать переменную для сборов выпуска, чтобы убедиться, что она безопасна, но оставить ее неонициализированной в сборках отладки и сборки дезинтеров, чтобы убедиться, что проверки функционируют правильно. А для Линтера я мог притворяться, что инициализировал переменную, просто чтобы закрыть глупую вещь. Я попробовал шаблон: < /p>

Код: Выделить всё

template  inline T Uninitialized() {
#if MUST_INIT_CASES
T value{};
#else
T value;
#endif
return value;
}

int result = Uninitialized();
< /code>
Но неудивительно, что ошибка была вызвана в шаблоне, а не в коде, который вернулся на результат шаблона.  Я не мог понять, как пройти это прозрачно.#if MUST_INIT_CASES
#   define UNINITIALISED {}
#else
#   define UNINITIALISED
#endif

int result UNINITIALISED;
Но, может быть, есть что -то более надежное?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... sions-of-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»