在printf

时间:2015-11-17 06:03:01

标签: c++

struct MyClass
{
    operator const char* ()
    {
        return "hello";
    }
};

int main()
{
    MyClass obj;  
    std::cout << obj;    // ok
    printf("%s\n", obj); // Crash
}

为什么带有operator const char*的对象无法自动转换为const char* string中的printf以映射%s

是否只是因为类似printf的函数没有类型感知而且%s只期望一个带有终端0的char数组?

2 个答案:

答案 0 :(得分:5)

为什么呢?由于C ++中可变参数的限制:它们基本上没有类型,您可以将它们视为void *(但它们不是)。

所以知道,编译器不知道你认为应该是一个字符串。它很可能需要是整数,双精度或其他对象。或者仅仅是编译器选择的本身。

答案 1 :(得分:2)

当您使用:

致电browsers : ['Chrome'], plugins : [ 'karma-chrome-launcher', 'karma-jasmine' ]
printf

编译器不使用自动转换功能将printf("%s\n", obj); 转换为objchar const*按值传递到objprintf会尝试将该值视为printf。因此,您的程序显示未定义的行为。您必须明确地将char const*投射到obj,以使您的程序可预测。

char const*

如果您在编译器中打开警告级别,您可能会看到一些内容,表明在printf("%s\n", (char const*)obj); 调用中使用obj是不正确的。使用printf,我得到:

g++ -Wall