使用volatile字符串作为printf()的格式字符串

Tom*_* L. 2 c const volatile

假设我有以下函数签名:

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非易失性,因为它是在中断内访问的.

fst*_*std 7

constprintf()的签名声明的承诺printf()让-它不会乱用指向的数据format(因此,无论是char*const char*变量可以传递在format).

现在,你的数组是volatile(我希望你知道它的含义).编译器警告你,这个波动性在printf()范围内被丢弃- 你不会获得format 内部 访问的易失性语义printf().

作为建议做什么,我会说评估你是否真的希望数据的变化在中间显而易见printf().我无法找到理由,因此制作本地副本听起来很合理.

  • @Agent_L是的,它可以,只要你总是从头开始写它 (3认同)