众所周知且有用的功能是:
const
类型限定符禁止写入(修改)变量register
存储类说明符禁止获取变量的地址
但是,是否有一种标准方法来禁止读取(通过赋值)变量?
例如,对于此类变量,仅允许写入和/或获取地址。
问题的原因:需要有条件地禁止读取(通过赋值)某些变量。该语言是否提供了任何方法来做到这一点?如果不是,那为什么?
UPD。读者可能也会感兴趣:C:在编译时或运行时检查变量是否具有静态存储类说明符。
众所周知且有用的功能是:
const
类型限定符禁止写入(修改)变量register
存储类说明符禁止获取变量的地址但是,是否有一种标准方法来禁止读取(通过赋值)变量?
例如,对于此类变量,仅允许写入和/或获取地址。
问题的原因:需要有条件地禁止读取(通过赋值)某些变量。该语言是否提供了任何方法来做到这一点?如果不是,那为什么?
UPD。读者可能也会感兴趣:C:在编译时或运行时检查变量是否具有静态存储类说明符。
不,据我所知没有。
我不知道为什么,一个原因可能是它只是极少有用的东西。你(在我看来)实际上并没有解释你为什么想要这个,这进一步强调了这是一件相当复杂/奇怪的事情。
众所周知且有用的功能是:
const
类型限定符禁止写入(修改)变量
是的。
register
存储类说明符禁止获取变量的地址
没错,但这不是register
存储类的主要目的。
但是,是否有一种标准方法来禁止读取(通过赋值)变量?
我认为你想禁止......
_Write_only int x = 1;
int y = x;
...但是不,没有办法做到这一点。如果您有一个左值表达式来指定现有对象,例如设置该对象的值所必需的,那么该表达式也可用于读取该对象的当前值。
问题的原因:需要有条件地禁止读取(通过赋值)某些变量。
这没什么大不了的。你似乎只是在说,“我需要它,因为我需要它。”
该语言是否提供了任何方法来做到这一点?如果不是,那为什么?
如果您通过“为什么”要求我们支持我们的答案,那么我建议您参考标准的第 6.3.2.1/2 段,您会在其中找到:
除非是运算符的操作数,
sizeof
运算_Alignof
符,一元&
运算符,运算符,++
运算--
符,或运算符的左操作数.
或赋值运算符,将不具有数组类型的左值转换为存储在指定对象(不再是左值)
这不会为您询问的那种语义留下任何空间。
如果您通过“为什么”问题表示其他意思,那么我们只能推测,但我个人并不觉得这种情况令人惊讶。特别是,我不认为存在const
and register
as 暗示应该有一个限定词具有您所描述的效果。
如果您想要一个只能由一段代码 X 写入而不是读取的对象,那么您可以在 X 的范围之外声明它并使用无法从 X 访问的链接,并提供 X 可以调用的函数修改对象的值。例如,该对象可能static
在不同翻译单元的文件范围内声明,并在该单元中声明了一个外部编写器函数:
static int protected;
void set_protected(int value) {
protected = value;
}
然后其他翻译单元中的代码可以使用该函数来设置变量的值,但不能直接访问对象以读取其值。
请注意,如果您允许 X 获取受保护对象的地址,那么一切都会消失,因为可以取消引用以获得访问权限。
您需要从程序代码中隐藏变量
#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)
}