к какому пространству имен относится toupper - PullRequest
0 голосов
/ 06 октября 2009

когда я читаю пример кода на c ++ для начинающих, я озадачен использованием toupper в следующей строке:

std::transform(data.begin(), data.end(), data.begin(), ::toupper);

из приведенной выше строки я знаю, что "transform" происходит из пространства имен std, но я не знаю, из какого пространства имен происходит toupper. может быть, есть пространство имен по умолчанию для C ++, но это только мое предположение. так не могли бы вы объяснить мне здесь использование toupper?

Ответы [ 2 ]

8 голосов
/ 06 октября 2009

Если вы включите

<cctype>

тогда toupper () находится в пространстве имен std. Если вы включите

<ctype.h>

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

То же правило применяется к <cstring> против <string.h>, <cstdlib> против <stdlib.h> и т. Д.

4 голосов
/ 06 октября 2009

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

void foo() { std::cout << "global"; }
namespace inner {
   void foo() { std::cout << "inner"; }
   void call() {
      foo();   // prints inner
      ::foo(); // prints global
      ::inner::foo(); // prints inner (fully qualified namespace)
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...