C++将变量重新定义为常量

标签 c++ visual-c++ winapi constants

我有一个结构:

struct s
{
    UINT_PTR B_ID;
};
s d;
d.B_ID=0x1;

这很好用,但我希望 d.B_ID 保持不变。我尝试使用 (const) 但它没有用。因此,在我为 d.B_ID 赋值后,我想让它成为一个常量。

有什么想法吗?


编辑

好吧,我不希望整个结构是一个常量。
当我设置计时器并使用 b.B_ID 作为计时器的想法时。
在里面 开关(参数) { case b.B_ID//错误:B_ID 必须是常量 .... 休息; } 所以这就是为什么我需要它是一个常数

最佳答案

每个变量的变量修饰符在编译时是固定的。您可能需要解释您正在尝试做的事情的背景,但这也许能满足您的需求?

struct s
{
  int* const B_ID;
};

int main (void) {
  int n = 5;
  s d = {&n};
  int* value = d.B_ID; // ok
  //  d.B_ID = &n; // error
  return 0;
}

由于您使用的是 C++,因此我建议:

class s {
public:
    int* const B_ID;

    s (int* id) :
    B_ID (id) {
    }
};

void main (void) {
   int n = 5;
   s my_s_variable = s(&n);

   int* value = my_s_variable.B_ID; // ok
   //my_s_variable.B_ID = &n; // error
   return 0;
}

Ramiz Toma:好吧,我需要使用 s.B_ID=something 来做到这一点

在 C/C++ 中,类型修饰符(如 const)是在运行时为给定类型声明的,并且不能在运行时更改。这意味着如果变量声明为 const,则永远不能使用赋值运算符对其进行赋值。它只会在构造时被赋值。

但这不是问题,因为您始终可以通过适当的设计来解决这个问题。

如果您说您需要使用赋值,我认为这是因为您在知道变量的值是什么之前就创建了结构。如果是这种情况,那么您只需将结构声明移动到您知道该值之后。

例如

s d; //variable declaration

//calculate B_ID
//...
int* n = 5;
//...


d.B_ID = &n;

这是行不通的,因为如果您希望 b.D_ID 是“不可分配的”,它将始终如此。您将需要重构您的代码,类似于:

//calculate B_ID
//...
int* n = 5;
//...


s d (&n);
//good

关于C++将变量重新定义为常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3499529/

相关文章:

c++ - 读取大文件中一行的前 N ​​个字符的最快方法是什么?

c++ - 成员函数 SFINAE 错误 C2938

C++ 文件输入、流和编译

c++ - 通过从 C/C++ 调用 Windows API 函数来生成独立的汇编子例程

c++11:为什么没有将 "auto&"推断为正确的类型?

c++ - 如何使用boost program_options读取整数数组?

c++ - 如何创建属性存储二进制文件

c++ - 什么是 HMODULE?

c++ - 创建字符串的共享内存 vector

c++ - 自动重新排序 MFC 控件 ID