Почему argc не является константой?


int main( const int argc , const char[] const argv)

как Эффективный C++ пункт#3 гласит "использовать const всякий раз, когда это возможно", я начинаю думать "почему бы не сделать эти "постоянные" параметры const"?.

есть ли какой-либо сценарий, в котором значение argc изменения в программе?

7 100

7 ответов:

в этом случае, история-это фактор. C определил эти входные данные как" не постоянные", и совместимость с (хорошей частью) существующего кода C была ранней целью C++.

некоторые API UNIX, такие как getopt, на самом деле манипулировать argv[], Так что это не может быть сделано const по этой же причине.

(в сторону: интересно, что хотя getoptпрототип предполагает, что он не будет изменять argv[] но может изменить строки, на которые указывает страница руководства Linux это getopt переставляет свои аргументы, и похоже, они знают, что ведут себя непослушно. На справочной странице в открытой группе эта перестановка не упоминается.)

положить const on argc и 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.