我有一个不幸的情况,其中API A使用整数超时(以毫秒为单位),而API B使用浮点数超时(以秒为单位)。我希望编译器发出针对隐式转换的警告,以阻止我将错误的超时传递给错误的API。例如:
int timeout_ms = 1000;
double timeout_sec = 1.0;
a_func(timeout_ms); // OK
a_func(timeout_sec); // warning
MSVC中是否有警告我可以启用此行为?
答案 0 :(得分:2)
4244将为您提供所需的警告。
如果您使用的是Visual Studio 2013,那么感谢C ++ 11的神奇之处还有另一个更好的替代方案,即删除的功能。这将使尝试以可移植的方式错误地调用函数并且不依赖于编译器标志是错误的。
int timeout_ms = 1000;
double timeout_sec = 1.0;
void a_func(int);
void a_func(double) = delete;
int main(void)
{
a_func(timeout_ms); // OK
a_func(timeout_sec); // error C2280 : 'void a_func(double)' : attempting to reference a deleted function
}
答案 1 :(得分:1)
为什么不写一个小包装器来确保你不会错呢?
class Timeout {
int msec;
public:
Timeout(int milliseconds) : msec(milliseconds) {}
operator double() { return msec / 1000.0; }
operator int() { return msec; }
};
Timeout tout(1000);
afunc(tout);