Tag: 限定符

所有全局变量都应该是波动合格的吗?

在这个例子中,正确性是否要求将global_value声明为volatile ? int global_value = 0; void foo () { ++ global_value; } void bar () { some_function (++global_value); foo (); some_function (++global_value); } 我的理解是volatile是“用于” 映射内存和变量的指针,可以通过信号修改 (并且强调不是为了线程安全)但是很容易想象bar可能会编译成这样的东西: push EAX mov EAX, global_value inc EAX push EAX call some_function call foo inc EAX push EAX call some_function mov global_value, EAX pop EAX 这显然不正确,但即使没有volatile我认为根据C抽象机器它是有效的。 我错了还是有效? 如果是这样,在我看来, volatile常常被忽视。 […]

如果我可以通过C中的指针修改它,那么const限定符的目的是什么?

可能重复: 这个邪恶的演员是否被邪恶的编译器打败了? 你好, 如果我可以通过指针修改常量,那么它的目的是什么? 以下是代码: #include #include int main() { const int a = 10; int *p = (int *)&a; printf(“Before: %d \n”, a); *p = 2; /*a = 2; gives error*/ printf(“After: %d \n”, *p); return 0; } OUTPUT: 之前:10 之后:2 按任意键继续 。 。 。 使用Visual Studio 2008。

在function原型中是顶级易失性还是​​限制显着?

以下原型有什么实际区别吗? void f(const int *p); void f(const int *restrict p); void f(const int *volatile p); C11 6.7.6.3/15(最后一句)部分说,顶级限定符不是为了确定类型兼容性而考虑的,即允许函数定义在其参数上具有与原型不同的顶级限定符。声明了。 然而(与C ++不同)它并没有说它们被完全忽略了。 在const的情况下,这显然没有实际意义; 但是在volatile和restrict的情况下可能存在差异。 例: void f(const int *restrict p); int main() { int a = 42; const int *p = &a; f(p); return a; } 原型中是否存在restrict允许编译器优化读取a for return a; ? ( 相关问题 )