我们可以在g ++实现中重载sprintf吗?

时间:2016-06-03 01:58:44

标签: c++ g++ printf

我的朋友被分配到他公司的现有C ++项目上工作。在源代码中他看到了类似的东西:

char* tmp = "882.30";
char buff[32];
sprintf(buff, "%e", tmp);
printf("TEST: %s\n", buff);

编译时,会发出警告:warning: format '%e' expects type 'double', but argument 3 has type 'char*'但输出结果令人惊讶:8.823000e+002。他很好奇。怎么会这样?

为了澄清他创建了一个新的小项目,他使用了相同的上面的代码片段和相同的编译器,但它显示了非常不同的结果:2.647480e-314

环境:Centos 5.x,gcc 4.4.7。

这可能是什么原因?现有项目有sprintf或编译器的重载功能吗?

2 个答案:

答案 0 :(得分:2)

这是未定义的行为。

C99§7.19.6.1/ 9

  

如果任何参数不是相应的正确类型   转换规范,行为未定义。

这意味着您可以保证获得不可移植的结果/行为。

答案 1 :(得分:0)

您需要atof明确地将char *指针转换为double

#include <cstdio>
#include <cstdlib>

int main( void )
{
    const char* tmp = "882.30";
    char buff[32];
    sprintf(buff, "%e", atof( tmp )); 
    printf("TEST: %s\n", buff);
    return 0;
}
顺便说一句,你不能覆盖现有的功能,因为这违反了 一个定义规则(ODR。)