“volatile char *”类型的参数与“const char *”类型的参数不兼容

时间:2010-08-11 11:16:05

标签: c const volatile

我有一个函数,其原型如下:

void foo(const char * data);

在我的代码中,我有一个声明如下的全局变量

volatile char var[100];

每当我尝试这样做时:

foo(var);

编译器抛出以下错误消息:

类型“volatile char *”的参数与“const char *”类型的参数不兼容

为什么会这样?据我了解,我的函数中的变量不允许更改指针或其内容。我理解,因为我的全局变量是易变的,它可能随时发生变化,但是看到拥有一个易变的const变量是完全合法的,我不明白为什么我得到这个编译错误。

由于

- 阿姆鲁

3 个答案:

答案 0 :(得分:7)

这是因为隐式转换可以限定符添加到指针类型的目标,但不能删除它们。因此,如果您希望您的函数能够接受volatile和/或const限定指针,则必须同时声明它:

void foo(const volatile char * data);

答案 1 :(得分:5)

因为使用指向非易失性的指针访问volatile变量是错误的。对象是易失性的,然后它应该在任何地方被访问,或者你可以作为非易失性访问它,然后它不应该被标记为这样。下定决心。

答案 2 :(得分:2)

如果要在函数中处理volatile参数,则必须将其声明为:

void foo(const volatile char * data);

这样就可以了。但请注意,这也会为volatile带来foo的所有开销,即data[something]将在您访问它的任何位置从内存重新加载。

(通常volatile并不是一个好主意,除非您正在使用设备驱动程序。即使是使用线程进行并行处理,它通常也不能保证您在第一个站点的预期。)< / p>