2

我正在使用通用缓冲区 .c/.h 文件。我想创建一个限定为 volatile 以用作 com 缓冲区的实例。

下面的代码说明了问题,限定符丢失了??将缓冲区地址传递给成员函数时。

代码段使用 'const' 限定符作为示例,我假设 'volatile' 的行为方式相同。使用 Rowley ARM GCC 编译器。

typedef struct buff_t {
  char buffchar;
  int index;
  }buff;

void buff_init( buff *thisbuff ) {
  thisbuff->buffchar = 'x';
  thisbuff->index = 0;
  }


int main(void)
{

  buff memBuffer;
  buff const UARTBuffer;
  buff *buff_ptr;

  buff_ptr = &memBuffer;
  buff_init( buff_ptr );          /* struct elements initialized as expected */

  // UARTBuffer.buffchar = 'y';   /* this caught by compiler as error to read-only object */
  buff_ptr = &UARTBuffer;         /* compile warning: assignment discards 'const' qualifier from pointer target type */
  buff_init( buff_ptr );          /* UARTBuffer elements also initialized, expected const??? */

}
4

2 回答 2

2

代码尝试const通过指针修改结构对象,因此调用 Undefined Behavior(UB)。简而言之,它是无效代码。避免这种情况的唯一方法是不编写调用 UB 的代码。
请注意,编译器允许您编写此类代码并朝自己的脚(而不是脸)开枪并不意味着您应该这样做。如果您有枪,则有责任明智地使用它。

要将变量标记为volatile您只需要volatile在其声明期间添加关键字,就像const在程序中一样。

于 2012-05-16T04:40:53.580 回答
2

限定符是每个指针的属性,分别。

如果一个对象是const,并且您将非const指针指向它,则它不会生成指针const。编译器可能会警告您,或者您可能会在尝试写入时崩溃(与 无关volatile),但指针不会被视为const.

在您的情况下,buff_ptrand buff_init'sthisbuff都应该有限定符。

于 2012-05-16T04:42:24.907 回答