Pytanie o using namespace std;

dział ogólny

Pytanie o using namespace std;

Nowy postprzez GoldWolf » Å›roda, 18 marca 2009, 11:56

Kod: Zaznacz cały
#include <vcl>
#include <fstream>

//using namespace std; -> Tylko na borlandzie nie wywali błędu DLACZEGO !!!?!?!

void utworz_plik()
{
  ofstream strumien1;

  strumien1.open("uczen.txt", ios::out);
  if(strumien1.is_open())
  {
    for(int linia = 0; linia < 9; linia++)
    {
      strumien1 << "7";
      if(linia > 7)
      {

      }
      else
      strumien1 << "\n";
    }
    strumien1.clear();
    strumien1.close();
  }
  else
  strumien1.close();
}


Mam nadzieje, że pytanie jest czytelne druga linijka kodu. Na innych forach czytam, że to nie zgodne ze standardem blebleble itp i itd.
Ostatnio edytowano czwartek, 19 marca 2009, 00:07 przez GoldWolf, łącznie edytowano 1 raz
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez Witold » Å›roda, 18 marca 2009, 16:00

Dante napisał(a):
Kod: Zaznacz cały
#include <fstream>

//using namespace std; -> Tylko na borlandzie nie wywali błędu DLACZEGO !!!?!?!
...
}


Która wersja ? BCB6 Wywala:

BCB6 Messages napisał(a):[C++ Error] Unit1.cpp(24): E2451 Undefined symbol 'ofstream'
[C++ Error] Unit1.cpp(24): E2379 Statement missing ;
[C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'strumien1'
[C++ Error] Unit1.cpp(26): E2090 Qualifier 'ios' is not a class or namespace name
[C++ Error] Unit1.cpp(26): E2121 Function call missing )

Wklej może kod (uruchamialny) w którym nie wywala. Zapewne "using namespace std;", dostałeś gdzieś gratis.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez Cyfrowy Baron » Å›roda, 18 marca 2009, 17:28

w CodeGear RAD Studio C++ Builder 2007 błędu nie ma.

Poczytaj obie tutaj: Przestrzenie nazw.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez GoldWolf » Å›roda, 18 marca 2009, 23:56

Nie wiem dokładnie czy w linku, którym podałeś jest odpowiedź ale, że akurat czytałem rozdział książki "Model pamięci i przestrzenie nazw" i staram się stosować do stwierdzenia:
"Popularyzatorzy przestrzeni nazw mają jednak nadzieję, że programiści oprą się pokusie wygody i będą raczej preferować selektywne wprowadzanie nazw do kodu za pomocą deklaracji using

Jeśli chodzi o przestrzeń nazw to coś tam wiem, nie potrafię tylko zrozumieć dlaczego w borlandzie moja wersja
Borland® C++Builder® for Microsoft® Windows™ Version 10.0.2288.42451 Update 2 (czyli Turbo C++), nie muszę użyć instrukcji:

Kod: Zaznacz cały
using std::fstream
using std::ofstream
using std::ios



Nic nie dostaje gratis tak jest zauważyłem to na samym początku ale jakoś się tym nie przejmowałem dopiero bliższe poznawanie mechanizmów przestrzeni nazw i jeden pa....t na forum, zmusiło mnie do zastanowienia dlaczego Borland nie potrzebuje w/w dyrektyw.

Nie używam notacji .h co wyklucza, iż korzystam z :

Ponieważ język C++ jest (w pewnym uproszczeniu) rozwinięciem C, w dalszym ciągu można korzystać z biblioteki standardowej C (tzw. libc). Ze względu na zachowanie wstecznej kompatybilności umożliwiono korzystanie z niej tak jak wcześniej w C.
Jednak dostępna jest też wersja libc przygotowana specjalnie dla C++. Pliki nagłówkowe są w niej inaczej nazywane, wszystkie funkcje znajdują się dodatkowo w przestrzeni nazw std.


sugestii zawartej w linku. Dla mnie wytłumaczeniem(na chłopski rozum) było by include <vcl> -> ale wydaje mi się to mało prawdopodobne.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez Witold » czwartek, 19 marca 2009, 21:07

Dante napisał(a):Dla mnie wytłumaczeniem(na chłopski rozum) było by include <vcl> -> ale wydaje mi się to mało prawdopodobne.

To sobie akurat możesz sprawdzić – testowy projekt konsolowy bez vcl.

Dante napisał(a):Nic nie dostaje gratis


Raczej dostajesz, tylko nie to co myślałem. Poszukaj pliku nagłówkowego: IOSFWD (w nim jest m.in. deklaracja ofstream -> typedef basic_ofstream<char, char_traits<char> > ofstream;)

Kod: Zaznacz cały
// iosfwd standard header
#ifndef _IOSFWD_
...
#if _HAS_TRADITIONAL_IOSTREAMS

#if _HAS_NAMESPACE
using _STD ios;
using _STD streambuf;
using _STD istream;
using _STD ostream;
using _STD iostream;

using _STD filebuf;
using _STD ifstream;
using _STD ofstream;
using _STD fstream;

using _STD stdiobuf;
using _STD stdiostream;
#endif /* _HAS_NAMESPACE */

#endif /* _HAS_TRADITIONAL_IOSTREAMS */
#pragma option pop
#endif /* _IOSFWD_ */

/*
* Copyright (c) 1992-2003 by P.J. Plauger.  ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V4.02:1422 */



W pliku yvals.h możesz ustawić _HAS_TRADITIONAL_IOSTREAMS na 0, wtedy ten gratis (i pewnie inne) nie zostaną dołączone.
To spowoduje że trzeba będzie poinformować kompilator że fstream , ofstream itd. znajdują się w przestrzeni nazw std, inaczej wywali błędy. Tak przynajmniej mi się wydaje, nie testowałem tego dokładnie.

Do _HAS_TRADITIONAL_IOSTREAMS znalazłem takie opis:
Nonstandard functions

The C++ libraries include definitions for certain traditional but nonstandard Standard Template Library and iostream functions. You can omit these definitions by editing either or both of the following files:

version_path/include/cpp/std/yvals.h (complete library)
version_path/include/cpp/abr/yvals.h (abridged library)

To omit the Standard Template Library extensions, change the definition of _HAS_TRADITIONAL_STL to:
#define _HAS_TRADITIONAL_STL 0

To omit the iostream extensions, change the definition of _HAS_TRADITIONAL_IOSTREAMS to:
#define _HAS_TRADITIONAL_IOSTREAMS 0

To see which functions are nonstandard, look for the _HAS_TRADITIONAL_STL and _HAS_TRADITIONAL_IOSTREAMS macros in the library header files.

http://www.takefive.com/windsurf/techpu ... te_511.htm
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez GoldWolf » piÄ…tek, 20 marca 2009, 13:59

Raczej dostajesz, tylko nie to co myślałem. Poszukaj pliku nagłówkowego: IOSFWD (w nim jest m.in. deklaracja ofstream -> typedef basic_ofstream<char, char_traits<char> > ofstream;)


Czyli wynikało by z tego, iż jak bym sobie dodał coś takiego
Kod: Zaznacz cały
using _STD string; // oczywiście ta jedna linijka nie wystarczy ;-)

To mogę sobie używać metod tej klasy bez użycia jawnego przestrzeni nazw, czy takie rozwiązanie jest słuszne. Jeżeli sami twórcy je wprowadzili .....
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez Witold » sobota, 21 marca 2009, 00:59

Dante napisał(a):Czyli wynikało by z tego, iż jak bym sobie dodał coś takiego
Kod: Zaznacz cały
using _STD string; // oczywiście ta jedna linijka nie wystarczy ;-)

To mogę sobie używać metod tej klasy bez użycia jawnego przestrzeni nazw, czy takie rozwiązanie jest słuszne. Jeżeli sami twórcy je wprowadzili .....


ZTCW "_STD" znaczy (gdy się nie zmieni ustawień) "::std::" ("#define _STD ::std::" w yvals.h) czyli "using _STD string;" jest równoznaczne z "using std::string;"
Nie wiem czemu to tak ustawili (ten gratis using std::costam w nagłówku), ale jak rozumiem to dotyczy tylko strumieni, i jak to komuś przeszkadza może to sobie zmienić (ustawiając _HAS_TRADITIONAL_IOSTREAMS). Zresztą to chyba mały problem, możesz zawsze pisać std::costam np. "std::fstream", wtedy nie trzeba pamiętać o using a kod będzie przenośny.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Pytanie o using namespace std;

Nowy postprzez GoldWolf » sobota, 21 marca 2009, 08:04

Witold napisał(a):. Zresztą to chyba mały problem, możesz zawsze pisać std::costam np. "std::fstream", wtedy nie trzeba pamiętać o using a kod będzie przenośny.


Zgodzę się. Chciałem tylko trzeba wiedzieć, dlaczego tak jest, jakiś foch programistów ;-)................
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości