如何在C中使这个结构实例变为volatile?

时间:2012-05-16 04:36:23

标签: c function struct volatile

我正在使用通用缓冲区.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??? */

}

2 个答案:

答案 0 :(得分:2)

代码尝试通过指针修改const结构对象,从而调用未定义行为(UB)。简而言之,它是无效的代码。避免这种情况的唯一方法是不要编写调用UB的代码 请注意,编译器允许你编写这样的代码并用脚射击(而不是面部)并不意味着你应该。如果你有枪,你有责任明智地使用它。

要将变量标记为volatile,您只需在声明过程中添加关键字volatile,与程序中的const类似。

答案 1 :(得分:2)

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

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

在您的情况下,buff_ptrbuff_init的{​​{1}}都应该有限定符。