| Autor |
Nachricht |
Shade Of Mine
Moderator
Benutzerprofil
Anmeldungsdatum: 04.05.2001
Beiträge: 18947
|
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
|
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
|
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
|
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
|
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
|
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:
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
|
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
|
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
|
Daniel E. Mitglied
20:29:00 08.08.2002 Titel: |
|
Zitieren |
|
 |
Gerard
Mitglied
Benutzerprofil
Anmeldungsdatum: 05.01.2002
Beiträge: 6118
|
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 |
|
 |