假设我有以下函数签名:
int printf(const char * restrict format, ... );
Run Code Online (Sandbox Code Playgroud)
现在,我有一个字符串定义如下:
volatile char command_str[256];
Run Code Online (Sandbox Code Playgroud)
现在,当我想将此字符串传递给我的printf函数时,我将收到以下警告:
Warning 32 [N] 2943 : passing 'volatile char [256]' to parameter of type 'const char *' discards qualifiers C:\P\parameter\parameter.c
Run Code Online (Sandbox Code Playgroud)
我不想改变printf签名,最简单的解决方案就是让警告消失
printf((const char*)command_str, .......);
Run Code Online (Sandbox Code Playgroud)
我觉得这不是最好的解决方案.什么是正确的做法?我无法进行command_str非易失性,因为它是在中断内访问的.
在const中printf()的签名声明的承诺printf()让-它不会乱用指向的数据format(因此,无论是char*和const char*变量可以传递在format).
现在,你的数组是volatile(我希望你知道它的含义).编译器警告你,这个波动性在printf()范围内被丢弃- 你不会获得format 内部 访问的易失性语义printf().
作为建议做什么,我会说评估你是否真的希望数据的变化在中间显而易见printf().我无法找到理由,因此制作本地副本听起来很合理.