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

Can we overload sprintf in g++ implementation?

本文关键字:重载 sprintf 实现 g++ 我们      更新时间:2023-10-16

我的朋友被指派从事他公司现有的C++项目。在源代码中,他看到了这样的东西:

char* tmp = "882.30";
char buff[32];
sprintf(buff, "%e", tmp);
printf("TEST: %sn", 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或编译器的重载功能?

这是

未定义的行为。

C99 §7.19.6.1/9

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

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

您需要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: %sn", buff);
    return 0;
}

顺便说一句,您无法覆盖现有函数,因为这违反了一个定义规则 (ODR.)