Отключить дерьмо math.h при работе с cmath

Раньше у меня была проблема из-за перегрузки функций без std::. И проклятие все еще происходит время от времени, потому что я не использую using namespace std;.

Удаление с использованием пространства имен std приводит к тому, что программа получает дерьмо результаты

Есть ли способ отключить все эти нестандартные функции, которые происходят из c и работают только с функциями C++ в пространстве имен std (без использования using namespace std;)?

Другими словами: я хочу получить сообщение об ошибке, если я использую sin() вместо std::sin(), чтобы не допустить этой ошибки. Разумеется, не только для sin, но и для каждой функции, которая конфликтует с math.h.


person The Quantum Physicist    schedule 03.10.2013    source источник
comment
Вы не получите ошибку, если опустите math.h и используете sin без std:: ?   -  person cnicutar    schedule 03.10.2013
comment
Почему бы не добавить std::?   -  person Jesse Good    schedule 03.10.2013
comment
@cnicutar: Проблема в том, что <cmath> и друзья могут (или не могут) выгружать некоторые или все функции в глобальное пространство имен. Дерьмо в связанном вопросе произошло из-за случайного вызова ::abs(int) вместо std::abs(double).   -  person Mike Seymour    schedule 03.10.2013
comment
@JesseGood: Потому что иногда мы делаем ошибки. Вот почему вопрос заключается в том, как сделать это ошибкой, если мы совершим эту конкретную ошибку.   -  person Mike Seymour    schedule 03.10.2013
comment
@MikeSeymour О, приятно знать. Я думал, что cmath помещает все в std::.   -  person cnicutar    schedule 03.10.2013
comment
@MikeSeymour: теперь понятно, хотя я думаю, что печатать std:: должно стать второй натурой.   -  person Jesse Good    schedule 03.10.2013
comment
Все дело в ошибке! ошибка может заставить вас часами заниматься отладкой, потому что нет конкретного способа найти ее, кроме как перепроверить весь код! Это так противно!   -  person The Quantum Physicist    schedule 03.10.2013
comment
@TheQuantumPhysicist Согласен, это очень реальная проблема, вчерашний вопрос был связан с тем, что не использовалось std, и по стандартам S) людям потребовалось некоторое время, чтобы понять это.   -  person Shafik Yaghmour    schedule 03.10.2013


Ответы (2)


К сожалению, нет возможности сделать это. Правило состоит в том, что #include <math.h> помещает все имена в глобальное пространство имен, а также может помещать их в std::. Точно так же #include <cmath> помещает все имена в std:: и может также помещать их в глобальное пространство имен. Причина разрешения посторонних пространств имен заключается просто в том, что чистые версии вообще невозможно реализовать без серьезных операций с существующими библиотеками, которые могут даже не находиться под контролем компиляторов C++.

person Pete Becker    schedule 03.10.2013

Соберите все объявления функций из math.h в namespace neveruse и произнесите using namespace neveruse. Теперь все ссылки на неполное sin будут неоднозначными.

person n. 1.8e9-where's-my-share m.    schedule 03.10.2013
comment
Разве это не... как беспорядок в стандартной библиотеке? Как я могу знать, не повлияет ли это на что-то еще где-то еще? - person The Quantum Physicist; 03.10.2013
comment
Вы можете объявить любую функцию в своем собственном пространстве имен. Ни с чем не конфликтует. Единственный способ, которым это может повлиять на материал, - это генерировать ошибки компиляции. - person n. 1.8e9-where's-my-share m.; 03.10.2013