方便的 C 结构初始化

新手上路,请多包涵

我正在尝试找到一种方便的方法来初始化“pod”C++ 结构。现在,考虑以下结构:

 struct FooBar {
  int foo;
  float bar;
};
// just to make all examples work in C and C++:
typedef struct FooBar FooBar;

如果我想方便地在 C 中初始化它(!),我可以简单地写:

 /* A */ FooBar fb = { .foo = 12, .bar = 3.4 }; // illegal C++, legal C

请注意,我想明确避免使用以下符号,因为如果我将来更改结构中的 _任何内容_,我会觉得它会折断我的脖子:

 /* B */ FooBar fb = { 12, 3.4 }; // legal C++, legal C, bad style?

为了在 C++ 中实现与 /* A */ 示例相同(或至少相似),我必须实现一个烦人的构造函数:

 FooBar::FooBar(int foo, float bar) : foo(foo), bar(bar) {}
// ->
/* C */ FooBar fb(12, 3.4);

这感觉多余和不必要。此外,它与 /* B */ 示例一样糟糕,因为它没有明确说明哪个值属于哪个成员。

所以,我的问题基本上是如何在 C++ 中实现类似于 /* A */ 或更好的东西?或者,我可以解释为什么我不应该这样做(即为什么我的心理范式不好)。

编辑

_方便_,我的意思是可 维护 和 _非冗余_。

原文由 bitmask 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 518
2 个回答

c++2a 将支持指定初始化,但您不必等待,因为 GCC、Clang 和 MSVC 正式支持 它们。

 #include <iostream>
#include <filesystem>

struct hello_world {
    const char* hello;
    const char* world;
};

int main ()
{
    hello_world hw = {
        .hello = "hello, ",
        .world = "world!"
    };

    std::cout << hw.hello << hw.world << std::endl;
    return 0;
}

GCC 演示 MSVC 演示

2021 年更新

正如 @Code Doggo 所 指出的,使用 Visual Studio 2019 的任何人都需要为 /std:c++latest 下包含的“C++ 语言标准”字段设置 Configuration Properties -> C/C++ -> Language

原文由 ivaigult 发布,翻译遵循 CC BY-SA 4.0 许可协议

我个人发现,使用带有 struct 的构造函数是确保 struct 成员在代码中初始化为合理值的最实用的方法。

正如您在上面所说,一个小缺点是人们不会立即看到哪个成员是什么参数,但是如果将鼠标悬停在代码上,大多数 IDE 都会在这里提供帮助。

我认为更有可能的是添加了新成员,在这种情况下,我希望结构的所有构造都无法编译,因此开发人员被迫进行审查。在我们相当大的代码库中,这已经证明了自己,因为它指导开发人员需要注意什么,从而创建自我维护的代码。

原文由 user3333852 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题