ere*_*eOn 17 c++ arrays buffer
我正在设计一个Buffer类,其目的是代表一块内存.
我的底层缓冲区是一个char*(好吧,boost::shared_array<char>实际上,但它并不重要).
我一直在决定为我的构造函数选择什么样的原型:
我应该去:
Buffer(const void* buf, size_t buflen);
Run Code Online (Sandbox Code Playgroud)
或者:
Buffer(const char* buf, size_t buflen);
Run Code Online (Sandbox Code Playgroud)
或者是其他东西 ?
通常做什么,为什么?
Mik*_*rty 16
对于构造函数和其他API函数,其优点void*是允许调用者将指针传递给任何类型,而无需进行不必要的强制转换.如果调用者能够传递任何类型void*是有意义的,那么更可取.如果调用者能够传入真的只是有意义char*,那么使用该类型.
C++ 17
C++ 17 std::byte专门为此引入.
它的定义实际上很简单:enum class byte : unsigned char {};.
我通常用作unsigned char底层结构(不希望签名搞砸了我的缓冲区,因为我知道是什么原因).但是我经常输入它:
// C++11
using byte = unsigned char;
// C++98
typedef unsigned char byte;
Run Code Online (Sandbox Code Playgroud)
然后把它称为byte*在我看来整齐地传达了意义,比任何一个char*或void*至少更好.
我更喜欢char*,因为对我个人而言,它更适合作为"缓冲".void*似乎更像是"指向我不知道的东西".此外,无论如何,这都是你的基础.
我推荐uint8_t,它在stdint.h中定义.它与"typedef unsigned char byte"基本相同; 其他人一直在推荐,但它具有成为C标准一部分的优势.
至于void*,我只会将其用于多态.即.如果我还不知道它会指向什么类型的东西,我只会调用一些无效指针.在你的情况下,你有一个字节数组,所以我通过使用uint8_t*作为类型来标记它.
| 归档时间: |
|
| 查看次数: |
5724 次 |
| 最近记录: |