Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: FAQ - C++ (auch C++0x, C++11) ::  C Library nicht im namespace std;  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
Beitrag Shade Of Mine Moderator 18:09:00 08.08.2002   Titel:   C Library nicht im namespace std;            Zitieren

Hallo Leute!

Wie macht ihr es, wenn ich ein C++ Programm habt, dass ihr portabel gestalten wollt, doch ihr verwendet Funktionen aus der C Library.

Theoretisch sollten diese ja im namespace std; zu finden sein... Doch viele Compiler (darunter VC++, DMC++,...) haben das nicht. Dort besteht ja zB die datei cstring aus:

#ifndef bla
#include "string.h"
#endif

Bisher hab ich mir so geholfen:

#ifdef _MSC_VER || __DMC__
#define CLib
#else
#define CLib std
#endif

Aber das kanns ja nicht sein, oder doch?

Sagt mal, wie ihr das Problem loest...

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Werbeunterbrechung
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
Beitrag rüdiger Moderator 18:21:00 08.08.2002   Titel:              Zitieren

du könntest die Header ändern

C++:
namespace std
{
 #include <string.h>
}

_________________
.


Zuletzt bearbeitet von Gerard am 00:09:46 24.01.2004, insgesamt 1-mal bearbeitet
deleted_2013_01_05
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.06.2001
Beiträge: 1795
Beitrag deleted_2013_01_05 Mitglied 19:14:00 08.08.2002   Titel:              Zitieren

Ja das geht schon.
Bei VC mache ich auch immer das hier:
C++:
namespace std
{
   #include <cmath>
};


Zuletzt bearbeitet von Gerard am 00:10:20 24.01.2004, insgesamt 1-mal bearbeitet
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
Beitrag Shade Of Mine Moderator 19:56:00 08.08.2002   Titel:              Zitieren

schoen und gut, aber ob ich jetzt
namespace std {
oder
#define CLib

schreib ist im Grunde auch schon egal...

Wisst ihr echt keine andere Moeglichkeit als alle Compiler mit ifdef abzufragen?

Sollte ich vielleicht dem User die Verantwortung darueber geben! Wenn sein Compiler die C Library nicht in std hat, dann muss er irgendein Makro definieren...?

Ich kann mir kaum vorstellen, dass es da nicht irgendeine elegante Loesung gibt...

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Gerard
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2002
Beiträge: 6118
Beitrag Gerard Mitglied 20:14:00 08.08.2002   Titel:              Zitieren

wenn du deine includest so macht
C++:
namespace std
{
   #include <math.h>
   #include <time.h>
}  

muss du nicht extra die compiler mit #ifdef abfragen


Zuletzt bearbeitet von Gerard am 00:10:42 24.01.2004, insgesamt 1-mal bearbeitet
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 18706
Beitrag SideWinder Moderator 20:15:00 08.08.2002   Titel:              Zitieren

Wenn du sowieso "using namespace std;" drunterschreibst -> einfach <iostream> includen bzw. eine leere Headerdatei <std> die nur folgenden Code beinhaltet:
C++:
namespace std {}


Wenn du "using namespace std;" nicht verwendest kannst du entweder dem User die Verantwortung übertragen (gar nix schreiben, oder namespace std rund um deine Header schreiben - erstes hilft niemandem, zweites hilft nur dir).

Oder du kannst dem User deine Versionen der Header mitliefern (was imho dämlich ist).

Also bleiben dir doch wieder nur die Makros...

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/


Zuletzt bearbeitet von Gerard am 00:11:02 24.01.2004, insgesamt 1-mal bearbeitet
Marc++us
Moderator(S)

Benutzerprofil
Anmeldungsdatum: 05.04.2000
Beiträge: 17938
Beitrag Marc++us Moderator(S) 20:18:00 08.08.2002   Titel:              Zitieren

Sides Lösung ist nicht gut, da man in eigenen Headern ja keine Namespaces öffnen soll... ich denke mal, daß die Idee von Dimah am sinnvollsten ist.

Es ist aber denkbar, daß es dadurch Folgefehler gibt...

_________________
Viele Grüße
Marc++us
c++.de
Shade Of Mine
Moderator

Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
Beitrag Shade Of Mine Moderator 20:26:00 08.08.2002   Titel:              Zitieren

Naja, dann bleib ich wohl bei meiner Methode :(

Dimahs Methode gefaellt mir irgendwie nicht so gut.

Denn angenommen meine Library wird in einem anderen Projekt verwendet. Meine Library macht dann zB

namespace std {
#include <cstdio>
}

Aber der User verwendet cstdio auch in seinem Programm. Er denkt aber nicht an Portierbarkeit und lebt damit, dass die C Library nicht im namespace std liegt. Er schreibt:

#inlcude "my_lib.h"
#include <cstdio>

Nun haben wir den Salat -> printf und Konsorten ist im namespace std und der arme User bekommt Fehler die er nicht versteht...

_________________
A language that doesn't affect the way you think about programming is not worth knowing.
Daniel E.
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.07.2001
Beiträge: 4514
Beitrag Daniel E. Mitglied 20:29:00 08.08.2002   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
/* C++-Header hier einbinden oder einen Namespace "std" von Hand kreiren: */
namespace std {}
 
namespace old {
#  include <cstdio>
#  include <cctype>
/* usw usf */
   using namespace std;
}
 
old::printf (BLA);


Bleibt noch die Frage, was passiert, wenn man eine kaputte Bibliothek wie die des GCC 2.95.* hat, wo isspace als Macro implementiert ist (also `std::isspace' einen Compilerfehler verursacht). Bleibt also wieder nur ein `using namespace Bla'
Wenn die Funktionen auch noch C-Linkage haben, dann wird es ganz lecker ... :( Und wenn der Compiler keine Namespaces kennt, wird das alles fast schon wieder elegant. ;)

Das gehöhrt alles zur Sammlung: 0x3ff Tricks wie man in C++ doch programmieren kann. ;)


Zuletzt bearbeitet von Gerard am 00:12:14 24.01.2004, insgesamt 1-mal bearbeitet
Gerard
Mitglied

Benutzerprofil
Anmeldungsdatum: 05.01.2002
Beiträge: 6118
Beitrag Gerard Mitglied 17:34:00 20.08.2002   Titel:              Zitieren

Zitat:
Original erstellt von Shade Of Mine:
Naja, dann bleib ich wohl bei meiner Methode :(

Dimahs Methode gefaellt mir irgendwie nicht so gut.

Denn angenommen meine Library wird in einem anderen Projekt verwendet. Meine Library macht dann zB

namespace std {
#include <cstdio>
}

Aber der User verwendet cstdio auch in seinem Programm. Er denkt aber nicht an Portierbarkeit und lebt damit, dass die C Library nicht im namespace std liegt. Er schreibt:

#inlcude "my_lib.h"
#include <cstdio>

Nun haben wir den Salat -> printf und Konsorten ist im namespace std und der arme User bekommt Fehler die er nicht versteht...


aus der boost lib:
Boost.Compatibilty library
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// This file is automatically generated. Do not edit.
// ['../../../libs/compatibility/generate_cpp_c_headers.py']
// Mon Apr 16 15:16:00 2001 ('PST', 'PDT')

#ifndef __CTIME_HEADER

#define __CTIME_HEADER

#include <time.h>

 
namespace std {
  using ::size_t;
  using ::clock_t;
  using ::time_t;
  using ::tm;
  using ::asctime;
  using ::clock;
  using ::difftime;
  using ::localtime;
  using ::strftime;
  using ::ctime;
  using ::gmtime;
  using ::mktime;
  using ::time;
}

#endif // CTIME_HEADER

das bedient beide seiten, außer das alles in globalen namespace leigt und in std, aber so gesehen ist das das kleiner übel

ahja kläre mich mal auf was das mit der '#define CLib' ist


Zuletzt bearbeitet von Gerard am 00:12:49 24.01.2004, insgesamt 1-mal bearbeitet
c++.de :: FAQ - C++ (auch C++0x, C++11) ::  C Library nicht im namespace std;  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.