Я компилирую свою программу в Linux — она имеет следующую строку:
std::sqrt((double)num);
На окнах это нормально, но на Linux я получаю ‘sqrt’ не является членом ‘STD’
У меня есть включение для math.h
в чем проблема с этим?
Измените директиву на #include <cmath>
, C ++ заголовки формы <cxxxxxxx>
гарантированно иметь стандартные имена в std
пространство имен (и может необязательно предоставлять их в глобальном пространстве имен). <xxxxxx.h>
не.
это просто потому что <math.h>
не объявляет функции в namespace std
, Он был включен в стандарт C ++ только для совместимости. Правильное включение C ++ будет <cmath>
,
§D.5,2
Каждый заголовок C, каждый из которых имеет имя вида
name.h
, ведет себя так, как будто каждое имя помещено в стандартное пространство имен библиотекиcname
заголовок помещается в глобальную область имен. Не определено, были ли эти имена впервые объявлены или определены в пределах области имен пространства именstd
и затем вводятся в глобальную область имен пространства явным с помощью деклараций.
То, что ваш код работает под Windows, было чистой удачей — если вы хотите так его назвать. Последнее предложение дает подсказку, что может происходить под окнами, но не под linux: очевидно, что под окнами имена допустимы как в глобальном пространстве имен, так и в пространстве имен std
,