有没有标准的方法来禁止读取(通过赋值)变量?
Is there a standard way to prohibit reading (via assignment) of a variable?
已知且有用的功能是:
const
类型限定符禁止写入(修改)变量
register
storage-class 说明符禁止获取变量地址
但是,是否有禁止读取(通过赋值)变量的标准方法?
例如,对于这样的变量,只允许写and/or取地址。
提问原因:需要有条件地禁止读取(赋值)某个变量。该语言是否提供任何方法来做到这一点?如果不是,那是为什么?
更新。读者可能也有兴趣:.
没有,据我所知没有。
我不知道为什么,一个原因可能是它很少有用。你(在我看来)实际上并没有解释 为什么 你想要这个,这进一步强调了这是一个 convoluted/weird 想要的东西。
It is known and useful features that:
const
type qualifier prohibits writing (modification) of a variable
是的。
register
storage-class specifier prohibits taking address of a variable
是的,但这不是 register
存储的主要目的 class。
However, is there a standard way to prohibit reading (via assignment) of a variable?
我看你是想禁止...
_Write_only int x = 1;
int y = x;
...但是不,没有办法做到这一点。如果你有一个指定现有对象的左值表达式,例如设置该对象的值所必需的,那么该表达式也可用于读取对象的当前值。
Reason of the question: need to conditionally prohibit reading (via
assignment) of some variable.
这不是什么大不了的原因。你似乎只是在说,“我需要它,因为我需要它。”
Does the language provide any way to do
it? If no, then why?
如果您通过“为什么”要求我们支持我们的回答,那么我建议您参考标准的第 6.3.2.1/2 段,您会在其中找到:
Except when it is the operand of the sizeof
operator, the _Alignof
operator, the unary &
operator, the ++
operator, the --
operator, or the left operand of the .
operator or an assignment operator, an lvalue that does not have array type is converted to the value stored in the designated object (and is no longer an lvalue)
这不会为您询问的那种语义留下任何空间。
如果您通过“为什么”问题表达其他意思,那么我们只能推测,但我个人并不认为这种情况有任何令人惊讶的地方。特别是,我没有发现 const
和 register
的存在表明应该有一个具有您描述的效果的限定词。
如果您想要一个只能通过一段代码 X 写入而不能读取的对象,那么您可以在 X 的范围之外声明它,并使用不提供从 X 访问的链接,并提供一个函数X 可以调用它来修改对象的值。例如,对象可能在不同翻译单元的文件范围内声明为 static
,并在该单元中声明了一个外部编写器函数:
static int protected;
void set_protected(int value) {
protected = value;
}
其他翻译单元中的代码可以使用该函数来设置变量的值,但不能直接访问对象来读取它的值。
请注意,如果您允许 X 获取受保护对象的地址,那么所有内容都会消失 window,因为可以取消引用以获取访问权限。
您需要在程序代码中隐藏您的变量
#define CREATE_PROTECTED(var, type, val) type set_##var(type v){static type var = val; return var;}
#define GET(var) set_##var(val)
CREATE_PROTECTED(myvar, size_t, 500);
size_t foo(void)
{
return GET(myvar)
}
已知且有用的功能是:
const
类型限定符禁止写入(修改)变量register
storage-class 说明符禁止获取变量地址
但是,是否有禁止读取(通过赋值)变量的标准方法?
例如,对于这样的变量,只允许写and/or取地址。
提问原因:需要有条件地禁止读取(赋值)某个变量。该语言是否提供任何方法来做到这一点?如果不是,那是为什么?
更新。读者可能也有兴趣:
没有,据我所知没有。
我不知道为什么,一个原因可能是它很少有用。你(在我看来)实际上并没有解释 为什么 你想要这个,这进一步强调了这是一个 convoluted/weird 想要的东西。
It is known and useful features that:
const
type qualifier prohibits writing (modification) of a variable
是的。
register
storage-class specifier prohibits taking address of a variable
是的,但这不是 register
存储的主要目的 class。
However, is there a standard way to prohibit reading (via assignment) of a variable?
我看你是想禁止...
_Write_only int x = 1;
int y = x;
...但是不,没有办法做到这一点。如果你有一个指定现有对象的左值表达式,例如设置该对象的值所必需的,那么该表达式也可用于读取对象的当前值。
Reason of the question: need to conditionally prohibit reading (via assignment) of some variable.
这不是什么大不了的原因。你似乎只是在说,“我需要它,因为我需要它。”
Does the language provide any way to do it? If no, then why?
如果您通过“为什么”要求我们支持我们的回答,那么我建议您参考标准的第 6.3.2.1/2 段,您会在其中找到:
Except when it is the operand of the
sizeof
operator, the_Alignof
operator, the unary&
operator, the++
operator, the--
operator, or the left operand of the.
operator or an assignment operator, an lvalue that does not have array type is converted to the value stored in the designated object (and is no longer an lvalue)
这不会为您询问的那种语义留下任何空间。
如果您通过“为什么”问题表达其他意思,那么我们只能推测,但我个人并不认为这种情况有任何令人惊讶的地方。特别是,我没有发现 const
和 register
的存在表明应该有一个具有您描述的效果的限定词。
如果您想要一个只能通过一段代码 X 写入而不能读取的对象,那么您可以在 X 的范围之外声明它,并使用不提供从 X 访问的链接,并提供一个函数X 可以调用它来修改对象的值。例如,对象可能在不同翻译单元的文件范围内声明为 static
,并在该单元中声明了一个外部编写器函数:
static int protected;
void set_protected(int value) {
protected = value;
}
其他翻译单元中的代码可以使用该函数来设置变量的值,但不能直接访问对象来读取它的值。
请注意,如果您允许 X 获取受保护对象的地址,那么所有内容都会消失 window,因为可以取消引用以获取访问权限。
您需要在程序代码中隐藏您的变量
#define CREATE_PROTECTED(var, type, val) type set_##var(type v){static type var = val; return var;}
#define GET(var) set_##var(val)
CREATE_PROTECTED(myvar, size_t, 500);
size_t foo(void)
{
return GET(myvar)
}