【问题标题】:c++ access variable from different switch case来自不同开关盒的c ++访问变量
【发布时间】:2013-10-09 05:28:38
【问题描述】:

我正在创建一个 win32 应用程序并在我的 WM_CREATE 开关案例中初始化我的状态栏宽度变量。

case WM_CREATE:
  {
    int statwidths[] = { 200, -1 };
  }
  break;

我想在我的 WM_SIZE 开关盒中访问 statwidths[0],因为该数字将用于确定我的程序中其余窗口的大小。

case WM_SIZE:
  {
    int OpenDocumentWidth = statwidths[ 0 ];
  }
  break;

有没有办法做到这一点?它们都在同一个文件的同一个 switch 语句中。

【问题讨论】:

  • 不,您不能使用完全不同范围的变量。您必须将其移出。
  • ... 这可能对你没有什么好处(除了允许它编译之外),除非你也让它static。它的值不会在 Windows 消息之间保留,除非你把它放在你的 WndProc 中持久的存储中。
  • 这就是我的想法,但我不确定。我试着搜索了大约一个小时,然后在这里试了一下。看看是否有一些我不知道的后退功能。它会让我的程序变得更容易哈哈。
  • 继续向上移动 [N] 个作用域,直到所有需要访问该变量的代码都落在同一个(更全局的)作用域内。
  • 我只是在所有函数之外创建了一个全局变量,然后将硬编码 200 更改为该变量

标签: c++ winapi variables switch-statement case


【解决方案1】:

如果它们都在同一个 switch 语句中,那么绝对不是。考虑

switch (n) {
    case 1: {
    }
    case 2: {
    }
}

情况 1 的作用域仅在 n 为 1 时发生。如果我们在此处声明一个变量,然后使用 n=2 调用此代码,则不会声明该变量。

int n;
if(fileExists("foo.txt"))
    n = 2;
else
    n = 1;
switch (n) {
    case 1: {
        ostream outfile("foo.txt");
        ...
        break;
    }
    case 2: {
        // if outfile were to be initialized as above here
        // it would be bad.
    }
}

你可以在 switch 之外声明变量,但你不应该假设前面的 case 已经完成了它的事情,除非 switch 在循环内。

该死,我上次尝试在 Kindle 上这样做。

【讨论】:

    【解决方案2】:

    您需要为您的窗口处理创建一个类,它应该如下所示:

    class Foo
    {
    private:
      int* statwidths;
      HWND hwnd;
    
    public:
      Foo(){};
      ~Foo(){};
    
      bool CreateWindow()
      {
        //some stuff
        hwnd = CreateWindowEx(...);
        SetWindowLongPtr(hwnd  GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this));
        //some stuff
      }
    
      static LRESULT callback(HWND hwnd, ...)
      {
        Foo* classInfo = reinterpret_cast<Foo *>(GetWindowLongPtr(window, GWLP_USERDATA));
        case WM_CREATE:
        {
          classInfo->statwidths = new int[2];
          classInfo->statwidths[0] = 200;
          classInfo->statwidths[1] = -1;
          break;
        }
    
        case WM_SIZE:
        {
          int OpenDocumentWidth = classInfo->statwidths[0];
        }
    
        case WM_CLOSE:
        {
          delete [] classInfo->statwidths;
        }
      }
    };
    

    这只是您需要的一小段代码,但您可以将其用作您的基础,希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2012-09-19
      • 2012-07-05
      • 2015-06-25
      • 2020-09-02
      相关资源
      最近更新 更多