C 类型为“的参数”;挥发性炭*”;与类型为“的参数不兼容”;常量字符*”;
我有一个函数,其原型如下:C 类型为“的参数”;挥发性炭*”;与类型为“的参数不兼容”;常量字符*”;,c,constants,volatile,C,Constants,Volatile,我有一个函数,其原型如下: void foo(const char * data); 在代码的其他地方,我声明了一个全局变量,如下所示 volatile char var[100]; 每当我尝试这样做时: foo(var); 编译器抛出以下错误消息: 类型为“volatile char*”的参数与类型为“const char*”的参数不兼容。 为什么会这样?据我所知,函数中的变量不允许更改指针或其内容。我明白,因为我的全局变量是易变的,它可能随时发生变化,但鉴于拥有一个易变常量变量是完全合
void foo(const char * data);
在代码的其他地方,我声明了一个全局变量,如下所示
volatile char var[100];
每当我尝试这样做时:
foo(var);
编译器抛出以下错误消息:
类型为“volatile char*”的参数与类型为“const char*”的参数不兼容。
为什么会这样?据我所知,函数中的变量不允许更改指针或其内容。我明白,因为我的全局变量是易变的,它可能随时发生变化,但鉴于拥有一个易变常量变量是完全合法的,我不明白为什么会出现这个编译器错误
谢谢
--Amr因为使用指向非易失性的指针访问易失性变量是错误的。要么对象是易失性的,然后应该在任何地方都这样访问它,要么您可以作为非易失性访问它,然后不应该将其标记为易失性。下定决心。这是因为隐式转换可以向指针类型的目标添加限定符,但不能删除它们。因此,如果您希望函数能够接受
volatile
和/或const
限定指针,则必须同时声明它:
void foo(const volatile char * data);
如果要在函数中处理
volatile
参数,必须将其声明为:
void foo(const volatile char * data);
这样就行了。但请注意,这也会给实现foo
带来volatile
的所有开销,即数据[某些东西]
将在您访问它的任何时候从内存中重新加载
(通常情况下,volatile
不是一个好主意,除非您正在使用设备驱动程序。即使对于线程并行处理,它通常也不能保证您在第一个站点的期望。)