Правила и практики для префикса глобального пространства имен? - PullRequest
1 голос
/ 11 марта 2019

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

namespace library_code {

namespace win32_backend {

void some_backend_internal_function() {
    ::SomeWin32GlobalFunction(...); // pretty much non-issue, different rules on naming
}

}

}

И иногда даже небиблиотечные коды пишутся так:

int main() {
    using namespace ::boost::math::constants;

    std::cout << "pi = " << pi<double>();

    return 0;
}

Однако я почти никогда не видел, чтобы пространство имен std начиналось с префикса глобального пространства имен, такого как ::std::max(a, b), даже для таких проектов со строгими правилами. Это приводит меня в замешательство, так как на первый взгляд кажется противоречивым.

Почему некоторые проекты используют такие смешанные правила при использовании глобальных пространств имен? Просто std является популярным исключением? Каковы обоснования и идеи?

1 Ответ

0 голосов
/ 11 марта 2019

Ну, у этого вопроса может не быть только одного конкретного ответа, и многие могут не согласиться с моим ответом.

Я видел много библиотек, ссылающихся на глобальное пространство имен (prepended: :) вЧтобы предотвратить путаницупространство имен правильно.Это даст вам представление о том, как реализовать в вашем коде.

Тем не менее, я почти никогда не видел, чтобы пространство имен std добавлялось так, как :: std :: max (a, b), даже для такихпроекты со строгими правилами.Это приводит меня в замешательство, поскольку на первый взгляд это кажется противоречивым.

Ну, я никогда не использую using namespace std в своем коде, и я настоятельно рекомендую другим также не использовать его.Я видел много профессионалов, использующих using namespace std в своем коде. Это крайне нежелательно. Для них это привычка. Да, и это только в случае std, потому что в коде, если вы не используете using namespace std, вам придется использовать std:: снова и снова, что нежелательно для многих программистов.

Если вы используете max (), вы не будете знать, к какому пространству имен оно относится, но когда вы используете std:: max (), теперь вы знаете, что это часть стандартной библиотеки.

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

Например: вы включили много файлов, и вы определили max () в двух пространствах имен std и myNamespace, теперь вы используете

using namespace std;
using namespace myNamespace;

Теперь, когда вы используете max(), возникает путаница, поскольку max принадлежит какому пространству имен.

...