给定一个结构体(在 the 之前main()或之后声明)
struct
{
    ...
} bar;
我不知道如何管理这个以及如何对待这种对象。
一般来说,我想要一个 360° 的答案,但我也有几个问题:
- 这相当于声明一个static结构吗?
- 它在 C++11 中是合法且安全的吗?
- 如何通过引用访问栏?
对于最后一个,我在这里准备了一个小片段,它不起作用,但显示了我想要实现的目标。
给定一个结构体(在 the 之前main()或之后声明)
struct
{
    ...
} bar;
我不知道如何管理这个以及如何对待这种对象。
一般来说,我想要一个 360° 的答案,但我也有几个问题:
static结构吗?对于最后一个,我在这里准备了一个小片段,它不起作用,但显示了我想要实现的目标。
它是未命名结构的全局对象。您不能将此类型用作函数的参数(因为您不知道对象的真实类型)。您可以为此使用 decltype ,但不需要它,因为它是全局对象。这是合法和安全的。
#include <iostream>
struct
{
    double k1 =  0.123;
} bar;
int foo(decltype(bar)& a)
{
    return a.k1-1;
};
int main()
{
    std::cout << foo(bar) << std::endl;
    return(0);
}
真的,因为你只有这个结构的一个全局对象——你可以简单地使用
#include <iostream>
struct
{
    double k1 =  0.123;
} bar;
int foo()
{
    return bar.k1-1;
};
int main()
{
    std::cout << foo() << std::endl;
    return(0);
}
这相当于声明一个
static结构吗?
不,您会static为此使用关键字,就像任何其他static变量一样。它声明了一个全局变量,即具有静态存储持续时间和外部链接,相当于:
struct Bar {...};
Bar bar;
它在 C++11 中是合法且安全的吗?
是的。
如何通过引用访问栏?
由于该类型没有名称,因此必须通过模板参数推导或在 C++11 中进行推断:
auto & ref = bar;
template <typename Bar> void bar_by_ref(Bar & bar) { 
    /* do something with bar */ 
}
或者,在 C++11 中,可以通过以下方式提取类型decltype:
decltype(bar) & ref = bar;
1> bar 只是其类型的单个实例。您不能拥有与 bar 相同类型的另一个实例。它的类型是未命名类型结构,就像匿名联合一样。拥有这样一个是合法的。它更像是全局静态的(但不是静态的),只是因为您不能在其他文件中通过extern关键字引用它。任何黑客都必须在其他文件中引用它...?
3> 拥有它是合法的。
4> 你不能声明对你不知道类型的变量的引用。.虽然你可以在文件的任何地方访问/修改相同的对象,所以不需要参考。引用主要用于从代码中删除 * 和 -> ,否则引用所做的一切都可以通过指针来实现。
这只是一个全局变量。您可以从此编译单元中的任何函数或方法访问它。声明它的正确方法(关于您的代码段)是:
struct foo
{
    double k = 1.23;
};
foo bar;
现在您可以像这样简单地通过引用传递它:
void f(foo & b)
{
    b.k = 34.5;
}
在您的代码段中, bar 是一个类型为未命名结构的变量:
struct <unnamed>
{
    double k = 1.23;
} bar;
由于您没有为您的类型提供任何名称,因此您无法以经典方式将其作为参数传递给函数。C++11 允许您使用 decltype 指令执行此操作:
struct
{
    double k = 1.23;
} bar;
void f(decltype(bar) & b)
{
    b.k = 3.45;
}
至于你的问题:
它与静态结构不同。静态变量的行为方式略有不同。静态类(= 结构)也是。
在C++11 中使用全局变量是合法且安全的,但强烈建议不要使用它们,因为它们很容易破坏程序的逻辑或架构。相反,应该使用静态类或单例。
No.  static是一个存储属性。Astruct与任何其他数据类型一样:它可以是static, volatile, auto, extern,and某些实现定义的其他类型。
这是合法且安全的。
引用这样的结构:
struct {
     int   field1, field2;
     double  yada, yada2, yada3;
} bar1, bar2;
bar1.yada3 = 3.14159265358979;   // assign a field in the struct
bar2 = bar1;   // copy contents of bar1 to bar2