Я обнаружил, что использую параметры функции как для ввода, так и для вывода, и мне было интересно, будет ли то, что я делаю, укусить меня позже.Использование функциональных параметров как для входа, так и для вывода
В этом примере buffer_len
является таким параметром. Он используется foo
, чтобы определить размер буфера и сообщить вызывающему абоненту main
, сколько из буфера было израсходовано.
#define MAX_BUFFER_LENGTH 16
char buffer[MAX_BUFFER_LENGTH] = {0};
void main(void)
{
uint32_t buffer_len = MAX_BUFFER_LENGTH;
printf("BEFORE: Max buffer length = %u", buffer_len);
foo(buffer, &buffer_len);
printf("BEFORE: Buffer length used = %u", buffer_len);
}
void foo(char *buffer, uint32_t *buffer_len)
{
/* Remember max buffer length */
uint32_t buffer_len_max = *buffer_len;
uint32_t buffer_len_left = buffer_len_max;
/* Add things to the buffer, decreasing the buffer_len_left
in the process */
...
/* Return the length of the buffer used up to the caller */
*buffer_len = buffer_len_max - buffer_len_left;
}
Это нормально делать?
EDIT:
Спасибо за ваши ответы, но я бы предпочел, чтобы сохранить возвращаемое значение foo
для фактического результата функции (что имеет смысл с большими функциями). Будет ли что-то вроде этого более безболезненным в долгосрочной перспективе?
typedef struct
{
char *data_ptr;
uint32_t length_used;
uint32_t length_max;
} buffer_t;
#define ACTUAL_BUFFER_LENGTH 16
char actual_buffer[ACTUAL_BUFFER_LENGTH] = {0};
void main(void)
{
buffer_t my_buffer = { .data_ptr = &actual_buffer[0],
.length_used = 0,
.length_max = ACTUAL_BUFFER_LENGTH };
}
Это «ОК», если оно задокументировано, но на самом деле не является предпочтительным способом работы. Почему бы не вернуть функцию длины и оставить параметр длины буфера как регулярный 'uint32_t' (или, возможно,' size_t', поэтому вы можете передать 'sizeof (buffer)' функции)? –
Это синтаксически нормально, но лично я предпочитаю коды возврата. Если это невозможно, я бы хотел, чтобы * выделенный * выходной параметр, * особенно *, если он является передачей по ссылке. (Я мог бы не обращать внимания и продолжать в предположении, что мой «buffer_len» по-прежнему сохраняет исходное значение.) – DevSolar
Пока вы не использовали свое возвращаемое значение, я предпочитаю получать результат, а не определять переменную каждый раз, когда я использую эту функцию (или, может быть, я хочу ввести выражение). – BeyelerStudios