gpt4 book ai didi

c++ - 为什么 iostream 定义了一个 abs 函数,我该如何停止它?

转载 作者:可可西里 更新时间:2023-11-01 16:30:22 25 4
gpt4 key购买 nike

以下 C++ 代码无法编译:

int main() {
double a = abs(5.1);
return 0;
}

当然,它会提示 abs 没有定义。但以下确实编译:

#include <iostream>

int main() {
std::cout << abs(5.1) << std::endl;
std::cout << abs(-5.1) << std::endl;
return 0;
}

它输出两个 5(不是 5.1)。出于很多原因,这很糟糕。首先,abs 是一个非常自然和常用的函数,我一直都在使用它,但是 int 部分几乎从来不是我想要返回的。其次,对于我(或使用我的代码的人)来说太容易了,只写 abs 而没有注意到它编译但做了错误的事情,因为我(他们)真的很擅长忽略警告。第三,我只是不明白为什么 iostream 无论如何都要定义一个 abs 函数。第四,我真的不明白为什么它会进入全局命名空间。

有什么方法可以防止这个令人反感的 abs 函数进入我的全局命名空间?

如果重要,我正在使用

gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.6)

最佳答案

很可能 iostream 包括 stdlib.h 来完成它的一些工作。这是 header 的 C 版本,它仅在全局命名空间中为 int 声明 abs(在 C 中,您必须为 使用 fabs >double 值)。

我不知道有什么具体的方法可以防止 abs 以这种方式被包含,但我知道 g++ 4.5 much 在不带多余东西方面要好得多in by basic 包括 iostreamstring

也可能会收到一条警告,指出 double 被截断为 int(编辑:是的,使用 -Wconversion 发出警告)。

关于c++ - 为什么 iostream 定义了一个 abs 函数,我该如何停止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9725447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com