代码之家  ›  专栏  ›  技术社区  ›  ereOn

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

  •  15
  • ereOn  · 技术社区  · 14 年前

    我的潜在缓冲区是 char* (嗯,一个 boost::shared_array<char> 实际上,但这并不重要)。

    我一直在为我的构造器选择什么样的原型:

    Buffer(const void* buf, size_t buflen);
    

    或与:

    Buffer(const char* buf, size_t buflen);
    

    或者别的什么?

    通常做什么,为什么?

    6 回复  |  直到 14 年前
        1
  •  15
  •   Alex F    10 年前

    若缓冲区的类型为void*type,字符串的类型为char*type,那个么API接口对用户来说就更清晰了。比较memcpy和strcpy函数定义。

        2
  •  16
  •   Mike Morearty NiCk Newman    14 年前

    void* 它允许调用方传入指向任何类型的指针,而不必执行不必要的强制转换。如果调用方能够传入任何类型是有意义的,那么 无效* 更可取。如果打电话的人能通过 char* ,然后使用该类型。

        3
  •  9
  •   Matthieu M.    6 年前

    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;
    

    然后称之为 byte* char* void* 至少。

        4
  •  7
  •   Eli Bendersky    14 年前

    char* ,因为对我个人来说,作为“缓冲区”会更好。 void* 更像是“指向我不知道什么的指针”。另外,不管怎样,这就是你的内在本质。

        5
  •  7
  •   karadoc    13 年前

    我推荐uint8\t,它是在stdint.h中定义的。它与其他人推荐的“typedef unsigned char byte;”基本相同,但它的优点是它是C标准的一部分。

    至于void*,我只会用它来表示多态性。如果我还不知道它会指向什么类型的东西,我只会称它为空指针。在您的例子中,您有一个字节数组,因此我将使用uint8\u t*作为类型来标记它。

        6
  •  2
  •   Community CDub    7 年前

    我更喜欢 unsigned char * uint8_t * 对于缓冲区实现,因为 void *

    我更喜欢 无符号字符* 单位8\t* char * 因为 special rules 关于别名和 字符*