Ответ 1
Если функция не имеет ничего конкретного для возврата, часто принято возвращать один из входных параметров (тот, который рассматривается как первичный). Это позволяет использовать "цепные" вызовы функций в выражениях. Например, вы можете сделать
char buffer[1024];
strcat(strcpy(buffer, "Hello"), " World");
потому что strcpy
возвращает исходное значение dst
в качестве результата. В принципе, при разработке такой функции вам может понадобиться выбрать наиболее подходящий параметр для "цепочки" и вернуть его в качестве результата (опять же, если вы еще не указали, что нужно вернуть, т.е. Если в противном случае ваша функция вернет void
).
Некоторым это нравится, некоторые люди этого не делают. Это вопрос личных предпочтений. Стандартная библиотека C часто поддерживает эту технику, memcpy
является еще одним примером. Возможным случаем использования может быть что-то вроде строк
char *clone_buffer(const char *buffer, size_t size)
{
return memcpy(new char[size], buffer, size);
}
Если memcpy
не вернул указатель буфера назначения, нам, вероятно, придется реализовать выше, как
char *clone_buffer(const char *buffer, size_t size)
{
char *clone = new char[size];
memcpy(clone, buffer, size);
return clone;
}
который выглядит "дольше". Нет никаких оснований для какой-либо разницы в эффективности между этими двумя реализациями. И можно утверждать, какая версия более читаема. Тем не менее многие люди могут оценить "свободную" возможность написать такие краткие однострочные линии, как первая версия выше.
Довольно часто люди сбивают с толку, что memcpy
возвращает указатель буфера назначения, потому что существует распространенное мнение о том, что возврат формы указателя к функции обычно (или всегда) указывает на то, что функция может выделять/перераспределять память. Хотя это действительно может указывать на последнее, нет такого жесткого правила, и его никогда не было, поэтому часто высказываемое мнение о том, что возвращение указателя (например, memcpy
) является чем-то "неправильным" или "плохой практикой", абсолютно необоснованно.