没有指定初始值设定项的静态结构初始化?
Static struct initialization without designated initializers?
以下指定初始化程序示例在 Visual Studio 2019 中使用 /std:c++ 最新版本有效,但我想知道如何在 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
};
struct Foo
{
void *(Bar)();
};
Foo::Bar
是returnsvoid*
的成员函数。 C 没有成员函数,所以这在 C 中是不正确的。
{
.Bar = Bar;
}
这在两种语言中都是错误的。你不能在那里放分号。解决方法:去掉分号。可以选择用逗号替换。
此外,Foo::Bar
是一个成员函数,因此您不能为其提供初始化程序。您可能希望 Foo::Bar
成为指向 returns 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
.
Just to confirm, is &(struct Foo)
a compound literal?
(struct Foo) { ... }
是复合文字。在这种情况下,一元 & 是 addressof 运算符,复合文字是操作数。
Static struct initialization without designated initializers?
只需删除指示符,以便初始化器按声明顺序应用于成员。如果初始化器不在成员的声明顺序中,则初始化器必须重新排序。你的情况:
{
.Bar = Bar,
}
// becomes ->
{
/*.Bar =*/ Bar,
}
I am using C++
C++ 中没有复合文字。它们是 C 特性(自 C99 起)。
要用C++重写,需要使用命名变量:
static Foo foo {
Bar,
};
Foo *FooAPI = &foo;
以下指定初始化程序示例在 Visual Studio 2019 中使用 /std:c++ 最新版本有效,但我想知道如何在 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
};
struct Foo { void *(Bar)(); };
Foo::Bar
是returnsvoid*
的成员函数。 C 没有成员函数,所以这在 C 中是不正确的。
{ .Bar = Bar; }
这在两种语言中都是错误的。你不能在那里放分号。解决方法:去掉分号。可以选择用逗号替换。
此外,Foo::Bar
是一个成员函数,因此您不能为其提供初始化程序。您可能希望 Foo::Bar
成为指向 returns 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
.
Just to confirm, is
&(struct Foo)
a compound literal?
(struct Foo) { ... }
是复合文字。在这种情况下,一元 & 是 addressof 运算符,复合文字是操作数。
Static struct initialization without designated initializers?
只需删除指示符,以便初始化器按声明顺序应用于成员。如果初始化器不在成员的声明顺序中,则初始化器必须重新排序。你的情况:
{
.Bar = Bar,
}
// becomes ->
{
/*.Bar =*/ Bar,
}
I am using C++
C++ 中没有复合文字。它们是 C 特性(自 C99 起)。
要用C++重写,需要使用命名变量:
static Foo foo {
Bar,
};
Foo *FooAPI = &foo;