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
不是一个好主意,除非您正在使用设备驱动程序。即使对于线程并行处理,它通常也不能保证您在第一个站点的期望。)