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

时间:2021-01-07 21:35:09

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

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

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

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

constexpr

1 个答案:

答案 0 :(得分:4)

<块引用>
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) { ... } 是复合字面量。在这种情况下,一元 & 是 addressof 运算符,复合文字是操作数。

<块引用>

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

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

{
    .Bar = Bar,
}
// becomes ->
{
    /*.Bar =*/ Bar,
}
<块引用>

我正在使用 C++

C++ 中没有复合字面量。它们是 C 特性(自 C99 起)。

要在 C++ 中重写它,您需要使用命名变量:

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