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

Amr*_*hit 5 c const volatile

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

void foo(const char * data);
Run Code Online (Sandbox Code Playgroud)

在我的代码的其他地方,我有一个声明如下的全局变量

volatile char var[100];
Run Code Online (Sandbox Code Playgroud)

每当我尝试这样做:

foo(var);
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

--Amr

caf*_*caf 8

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

void foo(const volatile char * data);
Run Code Online (Sandbox Code Playgroud)


wil*_*ilx 6

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