【问题标题】: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格式]

【问题讨论】:

    标签: c casting warnings compiler-warnings


    【解决方案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 发出警告?
    猜你喜欢
    • 2018-12-06
    • 2021-05-03
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多