Почему argc не является константой?
int main( const int argc , const char[] const argv)
как Эффективный C++ пункт#3 гласит "использовать const всякий раз, когда это возможно", я начинаю думать "почему бы не сделать эти "постоянные" параметры const
"?.
есть ли какой-либо сценарий, в котором значение argc
изменения в программе?
7 ответов:
в этом случае, история-это фактор. C определил эти входные данные как" не постоянные", и совместимость с (хорошей частью) существующего кода C была ранней целью C++.
некоторые API UNIX, такие как
getopt
, на самом деле манипулироватьargv[]
, Так что это не может быть сделаноconst
по этой же причине.(в сторону: интересно, что хотя
getopt
прототип предполагает, что он не будет изменятьargv[]
но может изменить строки, на которые указывает страница руководства Linux этоgetopt
переставляет свои аргументы, и похоже, они знают, что ведут себя непослушно. На справочной странице в открытой группе эта перестановка не упоминается.)положить
const
onargc
иargv
не будет покупать много, и это приведет к аннулированию некоторых методов программирования старой школы, таких как:// print out all the arguments: while (--argc) std::cout << *++argv << std::endl;
я написал такие программы на C, и я знаю, что я не один. Я скопировал пример из где-то.
стандарт C (ISO/IEC 9899:2011) говорит:
5.1.2.2.1 запуск программы
¶1 функция, вызываемая при запуске программы под названием
main
. Реализация объявляет нет прототип для этой функции. Он должен быть определен с типом возврата int и без параметры:int main(void) { /* ... */ }
или с двумя параметрами (далее именуемые -
argc
иargv
хоть какие-то имена могут быть используются, так как они являются локальными для функции в какие они объявлены):int main(int argc, char *argv[]) { /* ... */ }
или эквивалент;10) или каким-то другим способом, определенным реализацией.
¶2 если они объявлены, то параметры к
argc
обычно не является константой, потому что сигнатура функции дляmain()
доconst
.поскольку argc является переменной стека, изменение его не повлияет ни на что, кроме вашей собственной обработки командной строки.
вы, конечно, можете заявить об этом
const
Если вы хотите.
топ-уровня
const
по формальному аргументу не является частью типа функции. Вы можете добавить или удалить его по своему усмотрению: это влияет только на то, что вы можете сделать с аргументом в реализации функции.и
argc
вы можете свободно добавитьconst
.но
argv
вы не можете сделать символьные данныеconst
без изменения таким образом сигнатуры функции. Что означает, что это тогда не один из стандартныхmain
функции подписи, и не должны быть признаны в качестве
подпись
main
Это что-то вроде исторического артефакта отC
. ИсторическиC
не былоconst
.тем не менее, вы можете объявить свой параметр
const
так как эффекты const-это только время компиляции.
, потому что
argc
является локальной переменной (и, в C++, не ссылка или что-то), а потому особое местоmain
означает, что махинации с обратной совместимостью предоставляют ему огромную свободу действий без веских причин силу приложения, чтобы сделать его const.main() {} int main() {} main() { return 0; } main(int argc, char* argv[]) { return 0; } int main(const int argc, const char** argv) { /* no return*/ }
эти и многие другие варианты будут компилироваться на широком диапазоне компиляторов C и c++.
так что в конечном счете это не то, что argc не const, просто у него нет но это может быть, если вы хотите, чтобы это было.
http://ideone.com/FKldHF, C пример:
main(const int argc, const char* argv[]) { return 0; }
http://ideone.com/m1qc9c, пример C++
main(const int argc) {}
помимо исторических причин, хорошая причина, чтобы сохранить argc и argv не -
const
заключается в том, что реализация компилятора не знает, что вы собираетесь делать с аргументами main, она просто знает, что она должна дать вам эти аргументы.когда вы определяете свои собственные функции и связанные с ними прототипы, вы знаете, какие параметры вы можете сделать
const
и какие функции будут изменены.доведенный до крайности, вы могли бы заявить, что все параметры для всех функций должны быть объявлены
const
, а затем, если бы у вас была причина изменить их (например, уменьшить индекс для поиска по массиву), вам пришлось бы сделать local non-const
переменные и скопироватьconst
значения аргументов в этих переменных. Это делает для занят-работы и дополнительного LOC без реальной выгоды. Приличный статический анализатор подберет, если вы не изменяете значение аргумента, и порекомендует вам сделать параметрconst
.