2016-07-08 4 views
0

Я начинаю на C++. Из того, что я понимаю, для того, чтобы использовать имя, мы должны включить библиотеку, состоящую из этого имени. После этого мы можем либо добавить имя пространства имен, либо использовать ключевое слово using.Нет необходимости в пространстве имен std при использовании функции isalpha

E.g.

без использования ключевого слова:

std::cout << "Hello Word!" << std::endl; 

С помощью ключевого слова:

using namespace std; 
cout << "Hello World!" << endl; 

Я видел рабочий образец кода в Интернет, который использует имя isalpha из locale библиотеки в std пространства имен. Однако этот образец не использует ни один из методов, упомянутых выше.

E.g.

#include <iostream> 
#include <locale> 
int main() { 
    std::cout << isalpha('a') << std::endl; 
} 

Может кто-нибудь объяснить мне, почему код все еще работает?

+1

Только если вы публикуете полный код (включая заголовки)! – juanchopanza

+0

Практические реализации стандартной библиотеки C++ копируют эти функции библиотеки C в пространство имен std. Но не удаляйте их из глобального пространства имен. Они также не могут, потому что это вызывает ошибки компоновщика. –

+0

Вся магия за '# include' заключается в том, что она просто копирует содержимое файла, который включен, который обычно содержит декларации (ы) экспортированных символов (функции, переменные), вот и все. – PcAF

ответ

5

Когда вы включаете заголовок C++ для библиотеки C объекта, то есть заголовок <cfoo> соответствующего заголовка C <foo.h>, то имена из библиотеки C объявлены в пространстве имен std. Однако дополнительно не указано, объявлены ли имена в глобальном пространстве имен.

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

+0

Извините. Думаю, я не объяснял ясно. Я использую библиотеку языков C++, а не библиотеку C. – LanceHAOH

+0

@LanceHAOH: Также не указано, содержит ли какой-либо заголовок C++ любые другие заголовки. Не полагайтесь на магические аварии; если вам нужно имя, включите заголовок, который его объявит. –

0

Есть два правильных варианта, а именно:

  1. // C++ header 
    #include <cctype> 
    int main() 
    { 
        return !std::isalpha('a'); 
    } 
    
  2. // C header 
    #include <ctype.h> 
    int main() 
    { 
        return !isalpha('a'); 
    } 
    

Компилятор разрешается объявлять дополнительные имена, помимо тех, которые указаны в стандарте, но ваш код не переносимый, если он полагается на такие артефакты реализации.

Всегда включайте правильные заголовки для функций, которые вы используете, и избегайте сюрпризов.

 Смежные вопросы

  • Нет связанных вопросов^_^