2012-04-14 3 views
20

Кто-нибудь знает о любых предупреждениях, которые компиляторы C++ предоставляют, чтобы обеспечить соблюдение корректности const? Например, было бы неплохо иметь предупреждение, созданное любым методом C++, который содержит неконстантный параметр, который никогда не изменяется внутри метода. Я вижу, что есть предупреждение компилятора gnu, называемое -Wsuggest-attribute = const; однако, когда я использую этот флаг, я получаю сообщение об ошибке, которое не распознается. Любые идеи почему?Предупреждения о корректности конструкции C++

+0

"сопзЬ корректность" не действительно имеют много общего с аргументами метода или локальными переменными. cppcheck может генерировать предупреждения стиля для методов класса, которые также могут быть сделаны const. –

+0

'-Wsuggest-attribute' относится к атрибутам функции, специфичным для GCC, а не к константной корректности. '__attribute __ ((const))' несколько похож на 'constexpr'. – Philipp

ответ

6

Я не думаю, что такое предупреждение существует, главным образом потому, что оно было бы бесполезным. Просто потому, что параметр не изменяется внутри вызова, не означает, что он должен быть сделан const только ради него.

Подумайте о virtual функции. Возможно, разработчик базового класса, хотя и не изменяя параметр в базовом классе, хочет оставить его до расширяющегося класса, изменять или не изменять этот параметр.

Кроме того, подумайте о больших приложениях, где модификация интерфейсов или API или что-то дорогое. Возможно, вам не придется изменять параметр сейчас, но намереваться сделать это в будущем. Теперь вы не сделаете это const и заставьте полностью перестроить и, вероятно, рискнуть в будущем, когда вы удалите const.

+2

Я вижу вашу мысль; Тем не менее, я все еще думаю, что это было бы полезно как предупреждение (возможно, не ошибка). Кроме того, кажется, что существует флаг для компилятора gnu, называемый -Wsuggest-attribute = const; но мой компилятор g ++ не распознает его. – user809409

+0

Не функция, которую я когда-либо оставил бы на компиляторе, но было бы неплохо время от времени пересматривать предложения. Если вы знаете, что функция не собирается изменять переменную, рекомендуется сделать ее const, поскольку она позволяет передавать переменные const. – Darinth

+0

[Rust] (https://www.rust-lang.org/en -US /) имеет эту функцию (ненужный 'mut'), и это то, что я пропустил, возвращаясь на C++ и стараясь убедиться, что API и локальные переменные по умолчанию неизменяемы. – phoenix

0

Нет, к сожалению, таких предупреждений нет. Вы просто получаете ошибки, если пытаетесь изменить константные объявленные параметры. Это связано с тем, что отсутствующие объявления const не изменяют правильность кода с точки зрения компиляторов. Но корректность const важна для компилятора, чтобы обнаружить потенциальную оптимизацию и улучшает читаемость кода. Это вопрос профессионализма. Особенно при использовании ссылок const правильность является обязательной. I often refer to this.
Компилятор сам по себе требует строгого соответствия, когда операторы (присвоение, преобразование, ...) вступают в игру. Здесь отсутствует const, и компилятор отказывается использовать оператор, потому что это имеет большое значение, если данный параметр может быть изменен или нет.

5

Осторожно, const параметр, как это:

void myFunc(int const param); 

делает не принадлежат к интерфейсу. Он относится к локальному масштабу функции реализация. На самом деле, эта функция:

int inc(int const param) { return param+1; } 

может быть объявлена ​​как

int inc(int param); 

Это не является нарушение константной парадигмы правильности, чтобы претендовать на право изменять переменный, но на самом деле не делает.

Если вас беспокоит const_cast, вы можете использовать его не в первую очередь или просто grep для этого в вашей базе кода.

0

Я не знаю таких предупреждений, и я думаю, что их было бы довольно сложно реализовать в компиляторе, то есть они замедляли бы его. Возможно, в некоторых инструментах статического анализа есть такие функции (но я тоже не знаю об этом).

Согласно Wsuggest-attribute=const, это - другая вещь. Он предложит использовать gcc-специфический «атрибут функции const», который, в основном, является математической функцией, получающей только значения (без указателей), не считывая и не изменяя какое-либо статическое/глобальное состояние и возвращающее только значение (без указателей) ,Для дальнейшего описания, смотрите здесь: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

0
-Wsuggest-attribute=const 

Этот анализ требует опцию

-fipa-pure-const 

который включен по умолчанию в

-O 

и выше

Смежные вопросы