海湾合作委员会:为什么这个fprintf的-Wformat警告?

时间:2011-08-05 12:28:46

标签: c gcc types warnings printf

我们清理了大量警告。在某些情况下,我们将%s替换为%d。一切似乎没问题,直到我们意识到生成的代码无法编译 - 字符串已被数字替换。

注意:我在复制和粘贴时检出了错误的版本。 fprintf字符串已被编辑!

GCC输出

  

fedex_plus / classes.c:2425:3:警告:格式'%s'期望参数类型为'char *',但参数3的类型为'int' [-Wformat]

第2424行和第2425行:

fprintf(file, "\n//\t%s_ptr create_TIE();\n\tIDL_Application_instance_ptr create_TIE();\n", 
    ENTITYget_CORBAname(entity));

功能ENTITYget_CORBAname:

const char *
ENTITYget_CORBAname (Entity ent)
{
    static char newname [BUFSIZ];
    strcpy( newname, ENTITYget_name(ent) );
    newname[0] = ToUpper (newname [0]);
    return newname;
}

4 个答案:

答案 0 :(得分:10)

我敢打赌,ENTITYget_CORBAname点上没有fprintf声明。如果是这种情况,则默认为隐式签名:

int ENTITYget_CORBAname(...);

因此关于结果类型的警告是int

使用-Wimplicit(隐含-Wall)检查您的代码,或尝试放置

const char *ENTITYget_CORBAname (Entity ent);
fprintf行之前

并检查警告是否消失。如果是,那么你可能会错过一个标题。

答案 1 :(得分:1)

如果要打印指针值,请使用%p,如果要打印从函数返回的字符串,请使用%s。在任何这种情况下都不要使用%d。请参阅here

答案 2 :(得分:1)

我假设ENTITY_GETCorbaName()返回一个字符串,因此如果要打印它,请使用%s。如果要将其打印为指针,请使用%p

答案 3 :(得分:0)

%s中使用printf打印该字符串,或使用%p中的printf显示指针值,您也可以使用%lld打印值