如何解决这个编译警告? (格式说明符问题)

Posted

技术标签:

【中文标题】如何解决这个编译警告? (格式说明符问题)【英文标题】:How to solve this compilation warning? (Format specifier issue) 【发布时间】:2014-03-20 06:25:42 【问题描述】:

我有这个代码:

PRINT_VALUE("Displaying value: %x",A->B.C.D);

D 是 unsigned short 类型。

#define  PRINT_VALUE(Name,Val)    \
    if(Val)fprintf(fp,Name,Val);fprintf(fp,"\n");\
    else fprintf(fp,Name);fprintf(fp,"\n");

即使我使用 %d 并将 A->B.C.D 转换为 int,同样的警告仍然存在。有什么帮助吗?

警告信息:

警告:格式“%x”需要匹配的“无符号整数”参数 [-W格式]

【问题讨论】:

【参考方案1】:

您的宏扩展有问题。我有一个类似的代码。

#define fp stdout

#define  PRINT_VALUE(Name,Val)    \
    if(Val)fprintf(fp,Name,Val);fprintf(fp,"\n");\
    else fprintf(fp,Name);fprintf(fp,"\n");

int main()

        short D = 0;
        PRINT_VALUE("Displaying value: %x", (unsigned int)D);

这个宏展开如下

int main()

    short D = 0;
    if((unsigned int)D)
    
        fprintf(stdout,"Displaying value: %x",(unsigned int)D);
        fprintf(stdout,"\n");
    
    else
    
        fprintf(stdout,"Displaying value: %x"); //<-- the warning is here
        fprintf(stdout,"\n");
    ;

else 部分也需要一个参数。可能这不是您希望宏执行的操作。

【讨论】:

我只想打印值。你能帮我修改一下代码吗? 您可以将宏中的else部分修改为使用fputs。但这只是一种解决方法。喜欢else fputs(Name, fp);。这只是为了跳过警告 谢谢您,您能否简要解释一下为什么 fputs 不发出警告而 fprintf 发出警告?

以上是关于如何解决这个编译警告? (格式说明符问题)的主要内容,如果未能解决你的问题,请参考以下文章

经验分享:如何解决VS编译器下面的C4819警告?两种方法

如何解决自制软件发生的这个问题?

Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?

如何解决无效的招摇警告

Iphone,我该如何解决这个警告:'-respondsToSelector:' not found in protocol(s)

如何使 SQLPlus 编译警告静音?