【问题标题】:Initializing structure object using std::fill使用 std::fill 初始化结构对象
【发布时间】:2019-01-03 09:59:01
【问题描述】:

我有一个结构,需要使用std::fill 初始化它的对象。

typedef struct _test
{
    char name[32];
    char key[4];
    int count;

}test;

到目前为止,我使用的是memset。我需要将其更改为std::fill。我在下面尝试过,但std::fill 会为结构对象抛出编译器错误。

test t;
char a[5];
std::fill(a, a + 5, 0);
std::fill(t, sizeof(t), 0);

注意:我不想使用这种方式进行初始化。 char a[5] = {0};

【问题讨论】:

    标签: c++ std


    【解决方案1】:

    你不需要std::fill(或std::memset,你应该阅读更多here)。只需值初始化结构:

    test t{};
    

    这将反过来对所有字段进行零初始化。除此之外,std::fill 接受一个范围,而t, sizeof(t) 不是一个范围。

    最后一点,typedef struct _test 是一个不必要的 C 主义。 C++ 中的结构标记也是一个新的类型名称。所以这样做是用_test 标识符污染封闭的命名空间。如果您偶然需要 C 兼容性,那么可以这样做

    typedef struct test
    {
        char name[32];
        char key[4];
        int count;
    
    } test;
    

    尽管 struct 声明和 typedef 声明了相同的类型名称,但这种 typedef 在 C++ 中是明确有效的。它还允许 C 和 C++ 代码将类型称为 teststruct test

    【讨论】:

    • 结构是在 C 库之一中定义的。我的应用程序正在使用该结构。我无法控制 C 库。我将在代码的不同部分重用同一个对象,我需要将值重置为 0。在这种情况下,我必须使用 memset。所以我问了这个问题才知道,有没有办法用 std::fill 替换 memset
    • @Arun - 你想使用 memset 或 fill 的事实并没有改变你在 C++ 中不需要的事实。你想要零,我提供了一个答案,毫不费力地给零。
    • 如果你想重置,t = test{}; 就可以了。
    • 感谢您的信息。我尝试了数组的值初始化。它的工作方式与结构相同。有没有类似的方法来重置数组,或者我应该使用 std::fill 或 memset?
    • @Arun - 数组仍然需要std::fill。虽然如果你使用std::array,它也将具有完整的价值语义。
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多