-1

众所周知且有用的功能是:

  • const类型限定符禁止写入(修改)变量
  • register存储类说明符禁止获取变量的地址

但是,是否有一种标准方法来禁止读取(通过赋值)变量?

例如,对于此类变量,仅允许写入和/或获取地址。

问题的原因:需要有条件地禁止读取(通过赋值)某些变量。该语言是否提供了任何方法来做到这一点?如果不是,那为什么?

UPD。读者可能也会感兴趣:C:在编译时或运行时检查变量是否具有静态存储类说明符

4

3 回答 3

2

不,据我所知没有。

我不知道为什么,一个原因可能是它只是极少有用的东西。你(在我看来)实际上并没有解释你为什么想要这个,这进一步强调了这是一件相当复杂/奇怪的事情。

于 2021-06-03T19:35:23.803 回答
2

众所周知且有用的功能是:

  • const类型限定符禁止写入(修改)变量

是的。

  • register存储类说明符禁止获取变量的地址

没错,但这不是register存储类的主要目的。

但是,是否有一种标准方法来禁止读取(通过赋值)变量?

我认为你想禁止......

_Write_only int x = 1;
int y = x;

...但是不,没有办法做到这一点。如果您有一个左值表达式来指定现有对象,例如设置该对象的值所必需的,那么该表达式也可用于读取该对象的当前值。

问题的原因:需要有条件地禁止读取(通过赋值)某些变量。

这没什么大不了的。你似乎只是在说,“我需要它,因为我需要它。”

该语言是否提供了任何方法来做到这一点?如果不是,那为什么?

如果您通过“为什么”要求我们支持我们的答案,那么我建议您参考标准的第 6.3.2.1/2 段,您会在其中找到:

除非是运算符的操作数,sizeof运算_Alignof符,一元&运算符,运算符,++运算--符,或运算符的左操作数.或赋值运算符,将不具有数组类型的左值转换为存储在指定对象(不再是左值)

这不会为您询问的那种语义留下任何空间。

如果您通过“为什么”问题表示其他意思,那么我们只能推测,但我个人并不觉得这种情况令人惊讶。特别是,我不认为存在constand registeras 暗示应该有一个限定词具有您所描述的效果。


如果您想要一个只能由一段代码 X 写入而不是读取的对象,那么您可以在 X 的范围之外声明它并使用无法从 X 访问的链接,并提供 X 可以调用的函数修改对象的值。例如,该对象可能static在不同翻译单元的文件范围内声明,并在该单元中声明了一个外部编写器函数:

static int protected;

void set_protected(int value) {
    protected = value;
}

然后其他翻译单元中的代码可以使用该函数来设置变量的值,但不能直接访问对象以读取其值。

请注意,如果您允许 X 获取受保护对象的地址,那么一切都会消失,因为可以取消引用以获得访问权限。

于 2021-06-03T19:55:58.347 回答
0

您需要从程序代码中隐藏变量

#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)
}
于 2021-06-03T20:56:11.507 回答