C89 3.5.4.3 Function declarators
имеет это сказать о параметрах:
Для двух типов функций, которые должны быть совместимыми, оба должны указывать совместимые типы возврата. Более того, списки типов параметров, если они оба присутствуют, должны согласовывать число параметров и использовать терминатор с многоточием; соответствующие параметры должны иметь совместимые типы.
В разделе 3.1.2.6 Compatible type and composite type
указаны совместимые типы, аналогичные типу. Он ссылается 3.5.3
для определителей типа (из которых const
один) и что состояний:
Для два квалифицированных типов, чтобы быть совместимыми, то оба имеют одинаково квалифицированное версии совместимого типа; порядок классификаторов типов в списке спецификаторов или квалификаторов не влияет на указанный тип.
Теперь вы обычно считаете, что таким образом int
и const int
являются не совместимых типов. Тем не менее, я считаю, что это неправильное чтение стандарта просто потому, что int
не является квалифицированным типом, поэтому приведенная выше цитата не применяется.
Там это более применима цитатой позже в 3.5.4.3
заявив:
Для каждого параметра, объявленный с квалифицированным типом, его типом для этих сравнений является безоговорочной версией своего заявленного типа.
Следовательно, int
и const int
сравниваются аналогичным образом и должны быть разрешены. Но это означает, что это не ошибка в соответствии со стандартом. Возможно, Microsoft в своей мудрости все еще думает, что это подозрительное действие и хорошая причина выкачать предупреждение.
Даже если вы считаете, что проблема, очень маловероятно, что Microsoft исправит это для вас (см. Ниже).
Теперь вы можете задаться вопросом, почему я цитирую C89, когда доступны более современные стандарты.
Это потому, что Microsoft не делает секрета, что Visual C++ является, прежде всего ++ компилятором C и может компилировать код C только на раннее itertions стандарта, в соответствии с here:
Спасибо, что нашли время, чтобы отправить нам ваше предложение. В настоящее время нет планов по внедрению поддержки C99 в VS2010. После завершения этого цикла продуктов мы рассмотрим все предложения клиентов, в том числе и это, для нашего будущего планирования. - Марк Робертс, Microsoft.
И от wikipedia page:
Согласно Herb Sutter, компилятор Си включается только для «исторических причин» и не планируется дальнейшее развитие. Пользователям рекомендуется использовать только подмножество языка C, которое также является допустимым C++, а затем использовать компилятор C++ для компиляции своего кода или просто использовать другой компилятор, такой как Intel C++ Compiler или GNU Compiler Collection.
Это подтверждается в собственном блоге Герба Саттера, соответствующей статье here:
Мы не планируем поддерживать функции ISO C, которые не являются частью ни C90 или ISO C++.
Интересно. Где вы видели это в «обычной практике»? И да, правильно предупредить вас, хотя в этом случае не имеет значения, чтобы лизать, так как его параметр значения, и более ограничительный для стороны реализации для загрузки. Сделайте это с помощью * указателя *, и это сделает * большую * разницу. Пример: рассмотрим ветвления 'const char *', находящиеся в * prototype * и 'char *' в реализации. – WhozCraig
@WhozCraig - эквивалент с параметром указателя будет 'char * const param', но не' const char * param'. – detly
@WhozCraig - Но да, я знаю, это не имеет значения, это моя точка зрения. Это говорит компилятору и любому разработчику, что параметр «param» не может быть изменен телом функции, который является деталью реализации, которая не должна отображаться в объявлении. Итак, почему VS2010 выдает предупреждение, когда нет никакой несовместимости, нет различий в поведении и нет возможности непредвиденного поведения? – detly