【问题标题】:Static struct initialization without designated initializers?没有指定初始化程序的静态结构初始化?
【发布时间】:2021-01-07 21:35:09
【问题描述】:

以下指定初始化程序示例在 Visual Studio 2019 中使用 /std:c++latest 有效,但我想知道如何在 Visual Studio 2017 中没有指定初始化程序的情况下完成同样的事情。

我正在使用 C++,并且我意识到有一种面向对象的方法可以做到这一点,但我并不是在问如何使用构造函数在 C++ 中重新创建它。这使得这个问题的标记有点混乱,很抱歉有任何混淆。

我也在为这里的术语而苦苦挣扎。只是为了确认,&(struct Foo) 是复合文字吗?这是实现编译时静态初始化? constexpr 可以在这里以某种方式使用吗?

// Header
struct Foo
{
    void (*Bar)();
};

extern struct Foo *FooAPI;

// Source
static void Bar()
{

}

static struct Foo *FooAPI = &(struct Foo) { // Error: Expecting an expression
    .Bar = Bar
};

【问题讨论】:

  • 你的问题和C有关系吗?如果没有,请删除标签。
  • 在某种程度上,是的。
  • .Bar = Bar; --> .Bar = Bar。另外:void *(Bar)(); --> void (*Bar)();
  • C 和 C++ 是两种非常不同的语言,所以请不要同时标记这两种语言。您显示的代码不是有效的 C++ 代码,因为是的,它确实使用了复合文字。

标签: c++ c static visual-studio-2017 designated-initializer


【解决方案1】:
struct Foo
{
    void *(Bar)();
};

Foo::Bar 是返回void* 的成员函数。 C 没有成员函数,所以这在 C 中格式不正确。

{
    .Bar = Bar;
}

这在两种语言中都是错误的。你不能把分号放在那里。解决方法:去掉分号。可选用逗号替换。

此外,Foo::Bar 是一个成员函数,因此您不能为其提供初始化程序。您可能打算将Foo::Bar 用作返回void 的函数的指针。其语法是:

struct Foo
{
    void (*Bar)();
};
// or nicer way:
struct Foo
{
    using Fun = void();
    Fun* Bar;
};
extern struct Foo *FooAPI;
static struct Foo *FooAPI =

声明为extern 的变量不能重新声明static。解决方法:删除static

确认一下,&(struct Foo) 是复合文字吗?

(struct Foo) { ... } 是复合文字。在这种情况下,一元 & 是地址运算符,复合文字是操作数。

没有指定初始化器的静态结构初始化?

只需删除指示符,以便初始化程序按其声明顺序应用于成员。如果初始化器不在成员的声明顺序中,则必须重新排序初始化器。在你的情况下:

{
    .Bar = Bar,
}
// becomes ->
{
    /*.Bar =*/ Bar,
}

我正在使用 C++

C++ 中没有复合文字。它们是 C 功能(自 C99 起)。

要用C++重写它,你需要使用一个命名变量:

static Foo foo {
    Bar,
};
Foo *FooAPI = &foo;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2021-01-31
    • 2013-09-22
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    相关资源
    最近更新 更多