В чем разница между использованием стандартного разрешения области видимости для методов cmath и его неиспользованием?
#include <cmath>
double a = std::atan(0);
vs.
#include <cmath>
double a = atan(0);
Причина, по которой я спрашиваю, заключается в том, что я создаю собственный статический метод «атан», и при вызове его из статического метода он явно конфликтует с именем самого статического метода. Итак, здесь я избегаю конфликта, используя 'std::', но это заставляет меня задуматься о том, что происходит под капотом.
Заголовочный файл:
class MathCustom
{
public:
static double atan(int x, int y);
};
СРР-файл:
#include <cmath>
double MathCustom::atan(int x, int y)
{
if (x == 0 && y == 0) { return 0; } // undefined angle, but will be set to 0;
if (x == 0) { // y != 0
return (y > 0) ? std::atan(INFINITY) : std::atan(-INFINITY);
} else { // x != 0 && y: any value
return std::atan(static_cast<double>(y) / static_cast<double>(x));
}
}
Оценил!
math.h
или использоватьusing
для переносимого использованияatan
безstd::
. - person Marc Glisse   schedule 18.03.2021::atan
, чтобы принудительно использоватьatan
, определенное в вашем файле. - person erip   schedule 18.03.2021a = ::atan(x);
) - person IWonderWhatThisAPIDoes   schedule 18.03.2021::atan
имеет наименьшие шансы на успех, так как глобальный (C-совместимый)atan
может быть макросом. - person rustyx   schedule 18.03.2021atan
не входит в глобальное пространство имен. Добавлениеusing std::atan;
до этого позволит скомпилировать его. Добавление#include <math.h>
должно разрешить его компиляцию (но не на моей машине, поскольку я намеренно не добавляю заголовочные файлы C в системный путь включения компилятора). - person Eljay   schedule 19.03.2021std::numeric_limits<double>::infinity()
вместоINFINITY
- person phuclv   schedule 19.03.2021