Кто-нибудь знает о любых предупреждениях, которые компиляторы C++ предоставляют, чтобы обеспечить соблюдение корректности const? Например, было бы неплохо иметь предупреждение, созданное любым методом C++, который содержит неконстантный параметр, который никогда не изменяется внутри метода. Я вижу, что есть предупреждение компилятора gnu, называемое -Wsuggest-attribute = const; однако, когда я использую этот флаг, я получаю сообщение об ошибке, которое не распознается. Любые идеи почему?Предупреждения о корректности конструкции C++
ответ
Я не думаю, что такое предупреждение существует, главным образом потому, что оно было бы бесполезным. Просто потому, что параметр не изменяется внутри вызова, не означает, что он должен быть сделан const
только ради него.
Подумайте о virtual
функции. Возможно, разработчик базового класса, хотя и не изменяя параметр в базовом классе, хочет оставить его до расширяющегося класса, изменять или не изменять этот параметр.
Кроме того, подумайте о больших приложениях, где модификация интерфейсов или API или что-то дорогое. Возможно, вам не придется изменять параметр сейчас, но намереваться сделать это в будущем. Теперь вы не сделаете это const
и заставьте полностью перестроить и, вероятно, рискнуть в будущем, когда вы удалите const
.
Я вижу вашу мысль; Тем не менее, я все еще думаю, что это было бы полезно как предупреждение (возможно, не ошибка). Кроме того, кажется, что существует флаг для компилятора gnu, называемый -Wsuggest-attribute = const; но мой компилятор g ++ не распознает его. – user809409
Не функция, которую я когда-либо оставил бы на компиляторе, но было бы неплохо время от времени пересматривать предложения. Если вы знаете, что функция не собирается изменять переменную, рекомендуется сделать ее const, поскольку она позволяет передавать переменные const. – Darinth
[Rust] (https://www.rust-lang.org/en -US /) имеет эту функцию (ненужный 'mut'), и это то, что я пропустил, возвращаясь на C++ и стараясь убедиться, что API и локальные переменные по умолчанию неизменяемы. – phoenix
Нет, к сожалению, таких предупреждений нет. Вы просто получаете ошибки, если пытаетесь изменить константные объявленные параметры. Это связано с тем, что отсутствующие объявления const
не изменяют правильность кода с точки зрения компиляторов. Но корректность const важна для компилятора, чтобы обнаружить потенциальную оптимизацию и улучшает читаемость кода. Это вопрос профессионализма. Особенно при использовании ссылок const правильность является обязательной. I often refer to this.
Компилятор сам по себе требует строгого соответствия, когда операторы (присвоение, преобразование, ...) вступают в игру. Здесь отсутствует const
, и компилятор отказывается использовать оператор, потому что это имеет большое значение, если данный параметр может быть изменен или нет.
Осторожно, const
параметр, как это:
void myFunc(int const param);
делает не принадлежат к интерфейсу. Он относится к локальному масштабу функции реализация. На самом деле, эта функция:
int inc(int const param) { return param+1; }
может быть объявлена как
int inc(int param);
Это не является нарушение константной парадигмы правильности, чтобы претендовать на право изменять переменный, но на самом деле не делает.
Если вас беспокоит const_cast
, вы можете использовать его не в первую очередь или просто grep
для этого в вашей базе кода.
Я не знаю таких предупреждений, и я думаю, что их было бы довольно сложно реализовать в компиляторе, то есть они замедляли бы его. Возможно, в некоторых инструментах статического анализа есть такие функции (но я тоже не знаю об этом).
Согласно Wsuggest-attribute=const
, это - другая вещь. Он предложит использовать gcc-специфический «атрибут функции const
», который, в основном, является математической функцией, получающей только значения (без указателей), не считывая и не изменяя какое-либо статическое/глобальное состояние и возвращающее только значение (без указателей) ,Для дальнейшего описания, смотрите здесь: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
-Wsuggest-attribute=const
Этот анализ требует опцию
-fipa-pure-const
который включен по умолчанию в
-O
и выше
- 1. Предупреждения о конструкции - DevExpress
- 2. Вопрос о правильности конструкции в C++
- 3. C# Мысли о такой конструкции
- 4. Декларация о конструкции в C
- 5. О динамической конструкции массива в C++
- 6. Требуется консультация о конструкции
- 7. Предупреждения о функциях в C
- 8. Предупреждения о запуске в C++
- 9. C# Обеспечение корректности метода итератора
- 10. предложение о конструкции кварцевой пружины
- 11. Проверка: комбинируя заявления корректности
- 12. Предупреждения о переопределении макросов
- 13. предупреждения о программе iphone
- 14. предупреждения о pdfminer
- 15. Предупреждения о неиспользованном параметре в C
- 16. Объект предупреждения о принимаемой памяти c
- 17. управление достигает конца предупреждения о недействительности C++
- 18. собрать предупреждения о функции с сокетом C
- 19. Создание пользовательского предупреждения о времени компиляции C#
- 20. предупреждения о тайных интерфейсах в проектах C#
- 21. Нет предупреждения о неявном
- 22. совет о подходящей конструкции базы данных и реализации с C#
- 23. Значение конструкции C
- 24. Корректность корректности - C API-слой прокладки
- 25. Ошибка корректности конструктора копии C++ игнорируется?
- 26. Предупреждения о грамматике Bison
- 27. Предупреждения о чистке пива
- 28. Предупреждения о операторах равенства
- 29. Предупреждения о сборке?
- 30. Предупреждения о дубликате записи
"сопзЬ корректность" не действительно имеют много общего с аргументами метода или локальными переменными. cppcheck может генерировать предупреждения стиля для методов класса, которые также могут быть сделаны const. –
'-Wsuggest-attribute' относится к атрибутам функции, специфичным для GCC, а не к константной корректности. '__attribute __ ((const))' несколько похож на 'constexpr'. – Philipp