BG Development


  Reply to this topicStart new topicStart Poll

> using namespace std, хедър с .h и без него
Gnus
Публикувано на: 27-10-2008, 09:50
Quote Post



Име: Георги Койчев
Група: Потребител
Ранг: Старо куче

Мнения: 683
Регистриран на: 13.03.06



Сутринта гледахме с жена ми една програмка която тя щеше дава на учениците. Те учат С++ и им се дават разни примерчета със сложността на Hello, World. По незнайна причина не щеше да й се компилира, не познаваше cout и др. такива. Аз оправих нещата, като сложих едно
CODE
using namespace std;

Обаче трябваше да измисля начин да стане без да се ползва този ред, защото не го били учили.
Оказа се, че при преписването тя е написала
CODE
#include <iostream>
вместо
CODE
#include <iostream.h>
и нещата се оправиха.
Аз пиша на С и особеностите на С++ ги знам повече от книжките, отколкото от практиката и не можах да си обясня, каква е разликата в инклудването на хедъра по двата начина и защо в единия случай трябва да се дава неймспейса, а в другия не?


--------------------
Парите не ме вълнуват. Успокояват ме.
PMEmail Poster
Top
donangel
Публикувано на: 27-10-2008, 09:53
Quote Post


Group Icon
Име: Дончо Ангелов
Група: VIP
Ранг: Почетен член

Мнения: 1757
Регистриран на: 12.11.04



По-добре да не си казвам какво ми е мнението за преподавател, който сам не може да си оправи програмката с трудността, която описваш. Ще е много лично и против правилата на форумът..

Неймспейсът винаги трябва да се дава, когато работиш със STL.


--------------------
PMEmail PosterUsers WebsiteICQYahooMSN
Top
Stenli
Публикувано на: 27-10-2008, 10:09
Quote Post



Име: Красимир
Група: Потребител
Ранг: Посетител

Мнения: 64
Регистриран на: 07.08.06



Разликата е, че по-старите компилатори не разпознават <iostrem> и трябва да се напише както в C <iostream.h>. При новите хедъри без "h" не се определят имена на файлове, а имена на идентификатори, които компилаторът може да свърже с файлове. Това мисля е най-общо за новите и старите header-и icon_lol.gif

едит: за да използваш новия стил хедъри трябва задължително да включиш и namespaces, защо е така е обяснено перфектно от Izida icon_wink.gif

Това мнение е било редактирано от Stenli на 27-10-2008, 10:24
PMEmail Poster
Top
jean_lesn
Публикувано на: 27-10-2008, 10:12
Quote Post



Име: Ян Лесневски
Група: Потребител
Ранг: Почетен член

Мнения: 972
Регистриран на: 26.05.04



Децата трябва да си го научат по правилния начин. #include <iostream.h> е остарял метод, смятан за deprecated. Вижте какво конско ми чете GCC (g++) при опит да ползвам този хедър:

QUOTE
warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of  of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.


PMUsers WebsiteICQ
Top
Izida
Публикувано на: 27-10-2008, 10:15
Quote Post


Group Icon
Име: Ирина Марудина
Група: Администратор
Ранг: Почетен член

Мнения: 1248
Регистриран на: 27.07.04



Основната разлика си остава това, че в "старите хедъри" (включени с .h) всички класове, функции и т.н. са дефинирани в глобалното пространство. Това е от времето преди въвеждането на пространствата от имена (namespaces). След въвеждането им вече всички класове на стандартните библиотеки са дефинирани вътре в именованото пространство std. Така че ако включиш новия хедър (без .h) трябва или пред всеки клас да слагаш "std::", или да укажеш на компилатора да търси в именованото пространство std чрез "using namespace std;".


P.S. Примерен iostream.h от GCC :
CODE
iostream.h
00001 // Copyright (C) 1997-1999, 2000 Free Software Foundation, Inc.
....
00027
00028 #ifndef _BACKWARD_IOSTREAM_H
00029 #define _BACKWARD_IOSTREAM_H 1
00030
00031 #include "backward_warning.h"
00032 #include <iostream>
00033
00034 using std::iostream;
00035 using std::ostream;
00036 using std::istream;
00037 using std::ios;
00038 using std::streambuf;
00039
00040 using std::cout;
00041 using std::cin;
00042 using std::cerr;
00043 using std::clog;
00044 #ifdef _GLIBCXX_USE_WCHAR_T
00045 using std::wcout;
00046 using std::wcin;
00047 using std::wcerr;
00048 using std::wclog;
00049 #endif
00050
00051 using std::ws;
00052 using std::endl;
00053 using std::ends;
00054 using std::flush;
00055
00056 #endif
00057
00058 // Local Variables:
00059 // mode:C++
00060 // End:


Вижда се, че прави именно това - да включи дадени обекти и класове в глобалното пространство като посочи в кои пространства участват.

Това мнение е било редактирано от Izida на 27-10-2008, 10:16


--------------------
Simplicity is harder than complexity.
Аbstractions save us time working, but they don't save us time learning. [Joel Spolsky]
Simplicity - the art of maximizing the amount of work not done.
PMEmail PosterUsers WebsiteICQ
Top
ljubo
Публикувано на: 27-10-2008, 13:43
Quote Post



Име: Любомир Янчев
Група: Потребител
Ранг: Старо куче

Мнения: 686
Регистриран на: 03.09.07



Безпорно .h е стар метод - със старите библиотеки...
using namespace std; ти вкл 1 добавка, която предотвратява писането на
std:: преди някои частни оператори от iostream...
например ако не напишеш using namespace std; и напишеш cout<<"blqh"; ще ти даде грешка, която можеш да поправиш с std::cout<<"blqh";

ОК?
В кое даскало преподава жена ти icon_confused.gif
PMEmail Poster
Top
nikolavp
Публикувано на: 27-10-2008, 15:57
Quote Post



Име: Никола Петров
Група: Потребител
Ранг: Активен

Мнения: 264
Регистриран на: 15.12.07



Искрено се надявам тази тема да е шега.


--------------------
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0