f(const x)
Часто ли вы дополнительно "защищаете" аргументы функции, делая им каст в const, например:
Код:
void Save2File(const char* const FileName); Отдельно оговорюсь: "защита" именно копируемых данных (передаваемых по значению, а не по ссылке или через указатель), т.е. от изменения которых в вызывающем коде ничего не меняется. |
Ответ: f(const x)
Код:
void Save2File(const char* const FileName); а так это адов бред, имхо. хотя больше бесит когда по константной ссылке передают всякие инты, чары и флоаты. |
Ответ: f(const x)
Цитата:
Ну из серии: скопипастил кусок кода из старой реализации, который оперирует массивом FileName и заодно изменяет адрес, хранимый в указателе (допустим, для той задачи это было адекватно [например, указатель ссылается на последний слеш в переданном имени], а в теперешней - нет) . И бац - ошибка. Пример синтетический конечно, но, если всё по уму писать, то многое от чего можно отказаться - некоторый контроль (особенно при коллективном программировании) можно возложить на язык. Не думаю, что часто в реализации вы используете повторно нессылочные аргументы - так чего же их не "закрыть"? Я не агитирую, я высказываю контраргумент для полноты картины |
Ответ: f(const x)
Цитата:
если ставим const - то ставим везде. или некрасиво. в твоем же примере это было бы как то так: Код:
void Save2File1(const char* const FileName) |
Ответ: f(const x)
Приблизительно понял смесь из memcpy и strcpy, но я же писал - в новой реализации как раз не нужно что либо делать (на запись) с аргументом.
Для адресования можно просто создать новый указатель (массив, напомню, и так константный). Код:
char* sl_ptr=FileName+х; Код:
FileName+=х; Наличие "защиты" какбэ говорит нам: имя файла определено в рамках функции раз и навсегда. Хотите создавать свои сущности - именуйте их иначе. Ладно: пусть это будет текущее время, переданное в функцию решения группы диф.ур-ий. |
Ответ: f(const x)
видимо я криво объяснил свою точку зрения. на счет копипаста она довольно проста на самом деле:
1) если у некоторых функций аргумент будет константным а у некоторых нет - то мы выносим детали реализации в интерфейс, а это говно. 2) поэтому, надо или у всех функций делать аргумент константным или у всех не делать 3) если у исходной функциии аргумент константный, то внутри находится код, который эту константность как-то обходит, и этот код будет копипаститься в новую функцию (также с константным аргументом) и успешно будет компилироваться. 4) если же у исходной функции аргумент НЕ константный, а у новой константный - то см пункт 1. |
Ответ: f(const x)
Цитата:
Остался лишь риторический осадок: может стоит запрещать изменять аргументы функций, передаваемые по значению правилами языка? |
Ответ: f(const x)
теоретически должно быть полезно.
на практике я куда чаще сталкивался с удобством изменения параметра (было пару раз), чем с ошибками, связанными из - за его не константности (ни разу не сталкивался). еще можно делать так (по крайней мере в студии ,не знаю насколько это по стандарту) с одной стороны остается чистый интерфейс - с другой, реализация может учитывать константным оставлять аргумент или нет. Код:
const char* x(const char* value); //Интерфейс |
Ответ: f(const x)
давайте попробуем заставить llvm ( http://llvm.org/demo/index.cgi ) выдать разный код с const и без, мой пример пока даёт одинаковый код :
Код:
#include <stdio.h> Код:
; ModuleID = '/tmp/webcompile/_10893_0.bc' Код:
.file "/tmp/webcompile/_11162_0.bc" |
Ответ: f(const x)
Цитата:
Импер предлагал использовать const для обнаружения возможных ошибок на этапе компиляции, а не для оптимизации исполнимого кода :) |
Ответ: f(const x)
импэ, переходи уже на функциональные языки - там много матана, теорката и главное (!) все переменные - неизменяемые.
|
Ответ: f(const x)
Цитата:
|
Ответ: f(const x)
Цитата:
но! в математике переменные вовсе не меняют своих значений. |
Часовой пояс GMT +4, время: 00:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot