我有一个结构:
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/