Я не знаю, почему этот код static_assert() не работает.

Это код:

#pragma once

#include <stdint.h>

namespace Detours
{
    static_assert(sizeof(uintptr_t) == sizeof(void *));
}

Я получаю это сообщение об ошибке:

Error (active) E2783 expected a comma (the one-argument version of static_assert is not enabled in this mode)

person terran20000    schedule 29.11.2020    source источник
comment
У вас есть основания полагать, что это должно сработать?   -  person cigien    schedule 29.11.2020
comment
Определить не работает. Какого результата вы ожидаете и что вместо этого наблюдаете?   -  person Igor Tandetnik    schedule 29.11.2020
comment
Это должно работать, потому что я смотрю парня с YouTube, и его код работает, но мой код не работает, может быть, потому, что ему 1 год?   -  person terran20000    schedule 29.11.2020
comment
Это не техническая причина, почему вы считаете, что код должен работать. Что заставляет вас думать, что видео на YouTube правильное?   -  person cigien    schedule 29.11.2020
comment
Ошибка (активная) E2783 ожидала запятую (версия static_assert с одним аргументом не включена в этом режиме), это ошибка, которую я получил   -  person terran20000    schedule 29.11.2020
comment
Вам нужно скомпилировать код в режиме c++17. И добавьте эту информацию к вопросу.   -  person cigien    schedule 29.11.2020
comment
static_assert требуется второй параметр - сообщение об ошибке - до C++17. Судя по всему, в вашем компиляторе не включен C++17. Либо придумай как его включить, либо добавь сообщение об ошибке, как в static_assert(condition, "Error message here")   -  person Igor Tandetnik    schedule 29.11.2020
comment
Вероятно, вы все равно захотите добавить сообщение об ошибке.   -  person drescherjm    schedule 29.11.2020
comment
у вас есть видео на ютубе или сайт, где я могу это сделать для 2019 года?   -  person terran20000    schedule 29.11.2020
comment
Включение c++17 находится в настройках проекта. Свойства -> C/C++ -> Язык -> Языковой стандарт C++   -  person drescherjm    schedule 29.11.2020


Ответы (2)


Объявление static_assert позволяет опустить параметр message, начиная с C++17. (cppreference)

Вам нужно включить C++17 в вашем компиляторе или заполнить параметр message следующим образом:

static_assert(sizeof(uintptr_t) == sizeof(void *), "The message you want to show.");

Смотрите также

Как включить компиляцию C++17 в Visual Studio?

person Sprite    schedule 29.11.2020

Функция языка, известная (по крайней мере, Microsoft) как краткий статический ассертер, то есть static_assert() только с одним аргументом, была введена в стандарте C++17. До этого второй аргумент (строковый литерал, сообщение об ошибке) является обязательным. Итак, компиляция вашего кода с (например) MSVC и флагом /std:C++14 дает эту ошибку:

ошибка C2429: языковая функция «краткое статическое утверждение» требует флага компилятора «/std: c++ 17»

И clang-cl дает:

предупреждение: static_assert без сообщения является расширением C++17 [-Wc++17-extensions]

Чтобы исправить это, либо переключите свой компилятор на соответствие стандарту C++17, либо, если у вас нет такой возможности, добавьте требуемый второй аргумент:

    static_assert(sizeof(uintptr_t) == sizeof(void*), "Wrong uintptr_t size!");

Но заметьте, даже при этом нет никакой гарантии, что утверждение будет успешным! Тип uintptr_t требуется только для того, чтобы иметь достаточный размер для корректного размещения указателя; он не должен быть точно такого же размера. См.: Что такое тип данных uintptr_t.

person Adrian Mole    schedule 29.11.2020