我發現自己使用函數參數輸入和輸出,並想知道我在做什麼會咬我以後。使用函數參數作爲輸入和輸出
在這個例子中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;
}
這是一件好事嗎?
編輯:
謝謝您的答覆,但我寧願保持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 };
}
只要有文件記錄,它就是「OK」,但它確實不是首選的操作方式。爲什麼不讓函數返回所用的長度,並將緩衝區長度參數保留爲常規的'uint32_t'(或者'size_t',這樣你就可以將'sizeof(buffer)'傳遞給函數)? –
它在語法上沒問題,但我個人更喜歡返回代碼。如果這是不可能的,我想要一個*專用*輸出參數,尤其是*,如果它是通過引用傳遞。 (我可能沒有注意並繼續假設我的'buffer_len'仍然保持原始值。) – DevSolar
只要你還沒有用完你的返回值,我更喜歡接收結果,而不是每次使用函數(或者我想輸入一個表達式)時都必須定義一個變量。 – BeyelerStudios