void*或char*用于通用缓冲区表示?

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*,那么使用该类型.


Ale*_*x F 15

如果缓冲区具有void*类型,并且string具有char*类型,则API接口对用户更清晰.比较memcpy和strcpy函数定义.


Mat*_* M. 9

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*至少更好.

  • 我不能这么努力+1.这可以减轻所有那些带有`char`的错误,比如`char buf [42]; ... if(buf [i] == 0xFF)//*永远不会* (2认同)

Eli*_*sky 6

我更喜欢char*,因为对我个人而言,它更适合作为"缓冲".void*似乎更像是"指向我不知道的东西".此外,无论如何,这都是你的基础.

  • `void*`不是"我不知道在哪里的指针",它是"指向我不知道是什么"的指针:-) (16认同)

kar*_*doc 6

我推荐uint8_t,它在stdint.h中定义.它与"typedef unsigned char byte"基本相同; 其他人一直在推荐,但它具有成为C标准一部分的优势.

至于void*,我只会将其用于多态.即.如果我还不知道它会指向什么类型的东西,我只会调用一些无效指针.在你的情况下,你有一个字节数组,所以我通过使用uint8_t*作为类型来标记它.