标签: static-initialization

在C++中初始化类的静态数组成员的更好方法(虽然const是首选)

我有一个指向函数的静态数组指针作为类的成员.

我需要对它进行初始化,但事实证明这个数组的长度是64K项,因此使用静态初始化器初始化它是不切实际的,就像{ x, y, z, ... }它会使代码混乱一样.

我反而用代码初始化它,有几个循环.

我想要这样做的方法是static在构造函数中初始化数组并为其设置一个标志,因此只有该类的第一个实例的构造才会触发此初始化.

从实例中访问这个静态标志也不是线程安全的,但这是另一个故事.

有更干净或更好的方法吗?

我也想要这个数组const,但我担心唯一的方法就是static {}初始化,对吗?

c++ static-initializer static-initialization static-array

0
推荐指数
1
解决办法
328
查看次数

为什么静态初始化顺序STILL未指定?

编译器是否具有生成所有全局变量的依赖关系树所需的所有信息,并为它们创建定义良好且正确的初始化顺序?我意识到你可以用全局变量写一个循环依赖 - 只做那种情况下未定义的行为 - 并且编译器可以警告并且可能有关它的错误.

通常这种情况的原因是它会给编译器制造商带来负担,或导致编译速度显着降低.我没有任何指标或证据表明在这种情况下这些都不是真的,但我倾向于两者都不是真的.

c++ global-variables static-initialization

0
推荐指数
1
解决办法
121
查看次数

为什么我的const或静态成员没有初始化?

我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得const或静态成员进行初始化,所以我可以在整个课程中使用它.

这是一个展示我的问题的例子(或者更确切地说是我的误解):

using System;

namespace ConstExample
{
  public class HasImmutableMember
  {
    // static private double fSectionLengthTolerancePerInch = 1 / (20 * 12);  // tolerance is 1" per every 20'
    private const double fSectionLengthTolerancePerInch = 1 / (20 * 12);  // tolerance is 1" per every 20'

    static HasImmutableMember()
    {
      Console.WriteLine("static c'tor: " + fSectionLengthTolerancePerInch);
    }

    public HasImmutableMember()
    {
      Console.WriteLine("instance c'tor: " + fSectionLengthTolerancePerInch);
    }
  }

  public class Program
  {
    public void Main(string[] args)
    {
      HasImmutableMember instance = new HasImmutableMember();
    } …
Run Code Online (Sandbox Code Playgroud)

c# static initialization const static-initialization

0
推荐指数
1
解决办法
167
查看次数

C中整数指针数组的静态初始化出错

我在初始化整数指针数组时遇到错误.虽然问题看起来很简单,但我无法理解这有什么问题.我是C编程的新手.

在此输入图像描述

c arrays pointers static-initialization turbo-c

0
推荐指数
1
解决办法
151
查看次数

在C++中使用变量而不是`#define`指定数组大小是不好的做法吗?(C错误:在文件范围内进行了可变修改)

在C中,const不允许使用变量声明数组大小,即使它是变量.例如:这无法在C中编译:

#include <stdio.h>

const int SIZE = 2;
int a[SIZE];

int main()
{
    a[0] = 1;
    a[1] = 2;
    printf("%i, %i", a[0], a[1]);       
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C中运行此代码

输出:

$gcc -o main *.c
main.c:5:5: error: variably modified ‘a’ at file scope
 int a[SIZE];
     ^
Run Code Online (Sandbox Code Playgroud)

但是,在C++中,它运行得很好.
在C++中运行上面的代码.

输出:

$g++ -o main *.cpp
$main
1, 2
Run Code Online (Sandbox Code Playgroud)

要使其在C中运行,必须使用#define而不是变量.即:

这在C或C++中运行得很好:

#include <stdio.h>

#define SIZE 2
// const int SIZE = 2;
int a[SIZE];

int main()
{
    a[0] = 1;
    a[1] = …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays compiler-errors static-initialization

0
推荐指数
1
解决办法
225
查看次数

用于静态变量的Constexpr构造函数会导致动态初始化

我有以下程序:

#include <iostream>

void Init();

struct Foo {
    Foo() {
        int *p = new int; // just to make sure Foo's ctor is not a constant expression
        Init();
    }
} foo;

struct Bar {
    constexpr Bar()
        : value(0) { }
    int value;
} bar;

void Init() {
    bar.value = 1;
}

int main()
{
    std::cout << bar.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这里foo的构造函数不是常量表达式,因此我们将动态初始化foo。但是bar的构造函数似乎是一个常量表达式,因此我们将对进行静态初始化bar。因此,bar必须先调用的ctor,然后foo将其1视为输出。我在GCC 8.3.0和Clang 8.0.0中观察到了这样的结果。但是对于Visual C ++,实际的输出是,0 …

c++ static-variables visual-c++ static-initialization constexpr

0
推荐指数
1
解决办法
69
查看次数