gpt4 book ai didi

c - 为什么在函数调用中丢弃 volatile 限定符会发出警告?

转载 作者:太空狗 更新时间:2023-10-29 16:46:06 25 4
gpt4 key购买 nike

(在我开始之前:我知道有关于这个主题的 existing questions,但我没有找到答案为什么这是一个问题。我经常这样做并且想知道我是否在制造潜在的问题。)

我很好奇为什么在函数调用中丢弃 volatile 限定符会引起编译器警告。

情况如下:

volatile uint8_t thingy;
void awesome_function(uint8_t *arg);

awesome_function(&thingy); << warning

现在,我的理解是 volatile 限定符将变量标记为可能会以超出编译器控制的方式发生变化的变量。因此禁用了某些优化(最重要的是,根据我的经验,删除“未使用”变量)。

但是,如果我将变量标记为 volatile,我担心会阻止此范围 中的优化。如果我将变量向下传递给一个函数,我通常很乐意在该函数中应用标准优化。*

即使编译器想要从函数中删除变量(我通常试图避免的优化)也是如此,因为即使这样做,也不会影响我在 中使用它这个范围; (的)函数本身就是我感兴趣的序列点(和左值)。

那么,既然函数调用不会在当前范围内启用重新排序,那么为什么丢弃限定符会发出警告?这是因为被调用函数范围内的潜在重新排序,这对于 volatile 变量是不允许的吗?如果是这样,为什么这是当前范围的问题?

(* 这通常是因为此类调用用于启动异步操作,最终将对传递给该函数的指针进行操作。该函数可以对指针做任何它喜欢的事情,前提是它最终会按要求更新它。 volatile 限定符用于提醒编译器局部变量将异步更改。)

最佳答案

这里的警告是因为编译器假设当您有一个指向 volatile 指针对象的指针时,您确实相信指针值可能会从外部源更改。当您将此指针传递给要求指向非 volatile 对象的指针的函数时,编译器会警告您函数调用可能以未正确说明事实的方式进行了优化该对象可能会发生变化。

您确定可以这样做的事实意味着您可能想放入一个显式转换以删除 volatile,例如这个:

awesome_function((uint8_t*) &thingy);

这明确地告诉编译器“我知道我要在此处删除 volatile,所以不要警告我。”毕竟,警告的全部意义在于您可能没有注意到这一点。

一个很好的类比是考虑const。如果您有一个指向 const 对象的指针,您就 promise 不会通过该指针修改该对象。如果您尝试将此指针传递给一个函数,该函数采用指向非 const 对象的指针,您会收到警告,因为编译器注意到您可能会意外地通过函数更改值。进行显式强制转换是一种告诉编译器“是的,我知道这个指针不应该用来修改东西,但我保证我知道我在做什么。”

希望这对您有所帮助!

关于c - 为什么在函数调用中丢弃 volatile 限定符会发出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16006165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com