根据 http://en.cppreference.com/w/cpp/string/byte/memcpy C++ 的 memcpy
采用三个参数:目标、源和大小/字节。它还返回一个指针。
void* memcpy( void* dest, const void* src, std::size_t count );
为什么呢?参数还不够输入和复制数据吗?
我是不是误会了什么?这些示例不使用返回值。
原文由 knittl 发布,翻译遵循 CC BY-SA 4.0 许可协议
根据 http://en.cppreference.com/w/cpp/string/byte/memcpy C++ 的 memcpy
采用三个参数:目标、源和大小/字节。它还返回一个指针。
void* memcpy( void* dest, const void* src, std::size_t count );
为什么呢?参数还不够输入和复制数据吗?
我是不是误会了什么?这些示例不使用返回值。
原文由 knittl 发布,翻译遵循 CC BY-SA 4.0 许可协议
IIRC,在 C 的早期版本中没有 void
返回。因此,由于遗留原因,已经存在足够长的库函数会返回 _一些东西_,这是他们能想到的最好的方法。
There are a bunch of functions in string.h
which return the destination parameter: memcpy
, strcpy
, strcat
.它不是很有用,但没有害处(可能在许多调用约定中甚至不需要指令来实现)。
您可能会想出一个用途: char *nextbuf = memcpy(get_next_buf(), previous_buf+offset, previous_size-offset);
而不是 char *nextbuf = get_next_buf(); memcpy(nextbuf, etc);
或其他东西。
为了比较, qsort
返回 void。本来可以定义为返回 base
的原则是“返回一些东西,它可能会派上用场”,但事实并非如此。 std::copy
更有用地将迭代器返回到输出范围的 _末尾_。对于调用者计算可能不是微不足道甚至不可能的非随机访问迭代器。
原文由 Steve Jessop 发布,翻译遵循 CC BY-SA 2.5 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
如果一个函数没有特定的返回值,通常习惯上返回一个输入参数(被视为 主要 参数的那个)。这样做允许您在表达式中使用“链式”函数调用。例如,你可以做
特别是因为
strcpy
返回原始dst
值作为其结果。基本上,在设计这样一个函数时,您可能希望为“链接”选择最合适的参数并将其作为结果返回(同样,如果您注意到要返回,即如果否则您的函数将返回void
)。有些人喜欢,有些人不喜欢。这是个人喜好的问题。 C 标准库通常支持这种技术,
memcpy
是另一个例子。一个可能的用例可能类似于如果
memcpy
没有返回目标缓冲区指针,我们可能必须将上述实现为看起来“更长”。这两种实现之间的效率没有任何差异。哪个版本更具可读性是有争议的。仍然有很多人可能会喜欢“免费”的机会来编写像上面第一个版本这样简洁的单行代码。
人们经常发现
memcpy
返回目标缓冲区指针令人困惑,因为普遍认为从函数返回指针应该通常(或总是)表明该函数可能分配/重新分配内存。虽然这 可能 确实表明后者,但没有这样的硬性规则,而且从来没有,所以经常表达的观点认为返回一个指针(如memcpy
确实)在某种程度上是“错误的”或“不好的做法”是完全没有根据。