C++ Setter/Getter,cout 工作,printf 失败
C++ Setter/Getter, cout works, printf fails
有人知道为什么C++在可变参数printf函数上失败吗?代码是可修复的吗?这只是一个简单的例子,但一般情况对我来说很重要。
#include <stdio.h>
#include <iostream>
using namespace std;
class Float32 {
public:
float & operator = (const float &newValue) {
return value = newValue;
}
operator float () const {
return value;
}
protected:
float value;
};
int main() {
Float32 value;
value = 0.5;
cout << "cout value: " << value << endl; // this works
printf("something fishy about varargs or something...n");
printf("printf value: %f", value); // fails (outputs random garbage value)
}
如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。
如果这是一个编译器错误/问题,我正在使用Visual Studio 2017。
不,没有编译器错误。一切都按预期工作。
有谁知道为什么C++在可变参数 printf 函数上失败?
printf("printf value: %f", value);
不会隐式调用转换运算符,而是严格期望float
值,而不是Float32
实例。
它不能这样做,因为%f
是在运行时解析的,printf()
不可能知道你的类在那个时候有一个转换运算符。
代码是可修复的吗?
你仍然必须明确地进行强制转换:
printf("printf value: %f", (float)value);
由于template<typename T> std::ostream& operator<<(std::ostream, const T&)
是一个模板函数,它将在编译时推断出最佳转换,这将相反。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- C++ Setter/Getter,cout 工作,printf 失败
- C printf 无法从终端按预期工作
- CUDA内核printf()在终端中不产生输出,在探查器中工作
- printf保持在循环外时工作正常,但在将循环保持在for循环中时会导致一些错误
- C++:printf 和 wprintf 不能一起工作 (Linux)
- 如何让 ss << f 像 printf( "%g" , f) 一样工作;
- printf函数是如何工作的
- printf使setrlimit无法工作
- %*.*d 在 printf() 中是如何工作的
- 带有inttype的枚举类的Printf不能在clang中工作
- 从技术上讲,变差函数是如何工作的?printf是如何工作的