используя только определенные функции из библиотеки? - PullRequest
2 голосов
/ 25 октября 2011

я хотел бы использовать только определенные функции из math.h (БЕЗ включая всю библиотеку)

например, мне нужно использовать "sqrt" и "exp", но у меня есть переменные с именем "y1"(и, возможно, другие), которые конфликтуют с определениями в math.h

как я могу использовать только определенные функции из такой библиотеки?

я пробовал

#define sqrt cmath::sqrt

но это не сработало, я видел нечто подобное раньше с

#define cout std::cout

, я думаю, поэтому я подумал, что это может сработать.

есть идеи?

Ответы [ 6 ]

4 голосов
/ 25 октября 2011

Поместите свой код в свое собственное пространство имен.Используя оператор пространства имен (: :), вы можете различать переменные с одинаковыми именами (и находящиеся в одной области видимости).

3 голосов
/ 25 октября 2011

Просто использовать их?

#include <cmath>

int main()
{
    double d = 4.0;
    sqrt(d);
    exp(d);
}

Вы также можете явно указать пространство имен:

#include <cmath>

int main()
{
    double d = 4.0;
    std::sqrt(d);
    std::exp(d);
}

Вы можете, если хотите, вводить конкретные имена из пространств имен, не вводя всего пространства имен. Это делается с помощью ключевого слова using. Пожалуйста, не создавайте #define для этого:

#include <string>

using std::string;

int main()
{
    string s = "foo";
}
1 голос
/ 25 октября 2011

Да, вы можете просто использовать нужные вам части.

Просто создайте свой собственный частичный заголовок mini_cmath.h для тех функций / глобалов, к которым вам нужен доступ (при условии, что эти неконфликт!).

Как отмечали некоторые, нет способа только #include данного чанка (если только во включенном заголовке нет макросов препроцессора, чтобы включить такую ​​вещь, например, windows.h)

Но если вы просто объявите те функции, которые вы хотите использовать (правильно), а затем скомпилируете и создадите ссылку (если необходимая библиотека включена в вашу ссылку), то вы великолепны.


Тем не менее, в более общем плане: глобальные переменные вообще плохая идея, но если вы абсолютно должны использовать их по вполне обоснованным причинам, то вам следует поместить их в пространство имен и ссылаться на них в своемисточник с полным именем:

namespace AcmeCorp {
  int g_fubar;
}
AcmeCorp::g_fubar = 9;
0 голосов
/ 26 октября 2011

y1() является одним из ряда расширений POSIX для математической библиотеки C. Вы можете удалить эти расширения, отменив определение следующих макросов, прежде чем включать <cmath>:

#undef _SVID_SOURCE
#undef _BSD_SOURCE
#undef _XOPEN_SOURCE

В целом, это также очень хорошая идея - избегать помещения любых ваших собственных имен в глобальное пространство имен, поскольку существует большая вероятность коллизии, если вы используете какие-либо библиотеки Си. Избегайте глобальных переменных всякий раз, когда вы можете, и, если вы должны их использовать, поместите их в свое собственное пространство имен.

0 голосов
/ 25 октября 2011

Просто #include <cmath>. Если ваши имена переменных являются такой проблемой, переименуйте их. Вы не можете включить только часть файла.

0 голосов
/ 25 октября 2011

РЕДАКТИРОВАТЬ : Почему y1 должен конфликтовать с чем-либо в math.h? Использовать ваше собственное пространство имен.Вы по-прежнему сможете использовать sqrt и получать доступ к вещам из своего пространства имен, разрешив с помощью mynamespace::y1.

В любом случае, cmath является псевдонимом заголовочного файла math.h.std - это пространство имен, которое содержит объект cout в iostream.h.

Поэтому, хотя вы можете использовать std::cout, вы не можете сделать то же самое разрешение области действия с файлом заголовка.Вам просто нужно включить math.h или cmath.

И вам не нужно использовать #define для такой игры.Просто добавьте using namespace std, и вам не придется решать область.

И использование всего пространства имен не вызывает никаких накладных расходов, если это то, что вас беспокоит.Ура!

...