В C ++ почему «не утверждать» ключевое слово? - PullRequest
6 голосов
/ 02 июня 2011

Теперь «static_assert» - это ключевое слово в C ++ 0x. Я подумал, что было бы логично заменить макрос «assert» на C ключевым словом «assert».

Ответы [ 7 ]

3 голосов
/ 02 июня 2011

static_assert интерпретируется во время компиляции, поэтому оно должно быть ключевым словом, чтобы компилятор мог его обработать.

assert не обязательно должно быть ключевым словом, и нет смысла делать этоВо-первых, поскольку программа может захотеть отреагировать на успешное или неудачное утверждение.Следовательно, имеет смысл реализовать его в библиотеке, и он обычно реализуется в виде макроса.

2 голосов
/ 14 октября 2014

Другие ответы дают некоторые возможные ответы на ваш вопрос, но недавнее предложение указывает, что assert действительно может стать ключевым словом в C ++ 17: https://isocpp.org/files/papers/N4154.pdf

2 голосов
/ 02 июня 2011

В основном, потому что это не нужно. Существующие механизмы утверждений для утверждений во время выполнения совершенно хороши и не требуют языковой поддержки.

2 голосов
/ 02 июня 2011

assert не имеет значения времени компиляции, кроме как во время предварительной обработки.Препроцессор не знает языка C ++, поэтому ключевое слово не имеет смысла.

Для сравнения, static_assert оценивается во время компиляции.Сделать это ключевым словом имеет больше смысла в этом отношении.Компилятор заботится о его существовании.

Есть и исторические причины;это не было ключевое слово в C, и если бы оно было одним из C ++, это привело бы к тому, что существующие макросы assert приводили к неопределенному поведению.

1 голос
/ 02 июня 2011

В C ++ 0x (из здесь ):

В C ++ 0x могут быть объявлены статические утверждения для обнаружения и диагностики распространенных ошибок использования во время компиляции.

это синтаксис static_assert:

>>-static_assert--(--constant-expression--,--string-literal----->

, где constant-expression необходимо контекстно преобразовать в bool.Если он преобразуется в false, то компилятор выдаст ошибку в соответствии с string-literal.

Итак, это в основном расширение языка, которому необходимо ключевое слово.Это не механизм выполнения.

Снова из документа, на который ссылаются выше:

Добавление статических утверждений к языку C ++ имеет следующие преимущества:

  1. Библиотеки могут обнаруживать распространенные ошибки использования во время компиляции.

  2. Реализации стандартной библиотеки C ++ могут обнаруживать и диагностировать распространенные ошибки использования, улучшая удобство использования.

  3. Вы можете использовать объявление static_assert для проверки важных программных инвариантов во время компиляции.

1 голос
/ 02 июня 2011

Это не может быть сделано для совместимости с кодом, уже написанным на c, который имеет assert в качестве имени переменной. И, следовательно, как упоминал oli, мы не сможем скомпилировать, поскольку assert больше не является макросом

1 голос
/ 02 июня 2011

assert может быть реализовано в библиотеке, static_assert не может. Так что static_assert получает ключевое слово, потому что ему нужна языковая поддержка, а assert - нет.

...