Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wie ist eigentlich bool in C99 implementiert ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.08.2007, 16:31 Uhr
cfx



Hi,
also im Grunde wollte ich bloß mal wissen, ob man sich sein eigenes bool programmieren kann.
Ich hab mal in die stdbool.h geschaut und Folgendes gefunden:

C++:
[...]
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
# if !defined(__GNUC__) ||(__GNUC__ < 3)
  typedef char _Bool;        /* For C compilers without _Bool */
# endif
#endif

#define bool  _Bool
#define true  1
#define false 0
[...]


Demnach sollte bool (bzw. eigentlich _Bool) vom Typ char sein.
Wenn bool aber vom Typ char ist, wie kann es dann sein, dass bei Deklaration einer booleschen Variable (oder auch bei einem Cast) er mir z. B. mit 'bool a = 7' als Ergebnis 1 liefert ?
Definiere ich ein eigenes bool, dann bekomme ich auch 7 als Antwort (was natürlich absolut falsch ist ).

Ich denke daher nicht, dass man so ohne Weiteres sein eigenes (richtiges) bool programmieren kann, aber mich würde dennoch interessieren, woran der Compiler erkennt, bei welchem char-Datentyp es sich um bool handelt.

Dieser Post wurde am 29.08.2007 um 16:35 Uhr von cfx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.08.2007, 16:42 Uhr
Tommix



Hallo,
bool ist nur dann char, wenn die obige Präprozessorbedingung nicht erfüllt ist. Bei Deinem Compiler tritt dieser Fall wie es aussieht nicht ein. Probier mal

C++:
#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)
# if !defined(__GNUC__) ||(__GNUC__ < 3)
#error Ich will bool!
# endif
#endif


Da sollte nichts passieren.

Gruß, Tommix

Dieser Post wurde am 29.08.2007 um 16:43 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.08.2007, 16:50 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich denke der standard sagt ganz einfach: es muß einen Datentypen _Bool geben, welcher in der lage ist, die Werte true (1) und false (0) aufzunehmen. Vermutlich erlaubt der Standard (im Sinne von nicht verbieten), daß

1. _Bool mit anderen Typen identisch sein darf aber nicht zwingend muß
2. _Bool noch weitere Werte ausser true und false aufnehmen kann

Ich traue das jedenfalls dem Standard zu, wenngleich ich ihn derzeit nicht in der Hand habe.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 29.08.2007 um 16:51 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.08.2007, 17:02 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wobei true ja nicht zwangsläufig gleich 1 ist sondern alles außer 0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.08.2007, 17:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Mich würde wundern, wenn true tatsächlich eine Menge von Werten wäre. Alle Definitionen, welche ich von true kenne, laufen letztlich auf einen Wert hinaus, nämlich 1.


Worauf Du vermutlich anspielst ist die Eigenschaft von C/C++, in Bedingungen Werte != 0 synonym zu true zu behandeln.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.08.2007, 17:37 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von virtual:

Worauf Du vermutlich anspielst ist die Eigenschaft von C/C++, in Bedingungen Werte != 0 synonym zu true zu behandeln.

Ja das meine ich, deswegen gehe ich davon aus das zumindest für C/C++ true eher irgendwie alla !false festgelegt ist...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.08.2007, 20:10 Uhr
Hans
Library Walker
(Operator)


Hi,

in der Datei auf www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf einem Draft des Standards liesst man auf Seite 265 (von 550):

Zitat von C99 Standard Draft:

7.16 Boolean type and values <stdbool.h>

1 The header <stdbool.h> defines four macros.

2 The macro
bool
expands to _Bool.

3 The remaining three macros are suitable for use in #if preprocessing directives.
They are
true
which expands to the integer constant 1,

false
which expands to the integer constant 0, and

_ _bool_true_false_are_defined
which expands to the integer constant 1.

4 Notwithstanding the provisions of 7.1.3, a program may undefine and perhaps then
redefine the macros bool, true, and false. 216)



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 29.08.2007 um 20:13 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.08.2007, 20:15 Uhr
cfx




Zitat:
bool ist nur dann char, wenn die obige Präprozessorbedingung nicht erfüllt ist.


Gut, okay, das sehe ich selber.
Das müsste dann aber bedeuten, dass der Datentyp bool (intern) im GCC eindeutig definiert ist (Wo auch immer das sein soll - gibt's einen Header oder besser Quelltextdatei, der/die die Datentypen à la int, char, long, ... auflistet/definiert ?).
Andererseits, wenn _Bool nicht definiert wäre, dann würde bool (hier) auch wie char behandelt, d. h. ein Cast à la '(bool) 65' müsste das Ergebnis 65 liefern und nicht 1.

Ihr versteht, worauf ich hinaus will, oder ?
Trotzdem ein Beispiel:

C++:
#include <stdio.h>
// #include <stdbool.h> // <- damit geht's

typedef char  Bool; // <- eigenes bool ('_' fehlt)
#define bool  Bool
#define true  1
#define false 0

int
main ()
{
    int a = 65;

    printf ("%d | %d\n", a, (bool) a); // 2x 65, wie erwartet
    return 0;
}


Also ich kenne mich mit dem Compiler-Aufbau nicht aus, würde aber vermuten, der Datentyp ist intern irgendwo definiert und kann nicht ohne größeren Aufwand einfach nachprogrammiert werden.

[EDIT] Man kann alternativ natürlich jederzeit auch einfach ein Macro zum Casten verwenden.

Dieser Post wurde am 29.08.2007 um 20:20 Uhr von cfx editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
29.08.2007, 23:34 Uhr
ao

(Operator)


Wenn du bool auf char typedef'st, hat es natürlich dieselben Eigenschaften wie char, und ein expliziter Cast auf bool ist in Wahrheit ein Cast auf char. Daher 65.

Wenn du den Compiler nach dem Wert von true fragen willst, schreibe printf ("%d", (1 < 2));

Statt (1 < 2) kannst du auch jeden anderen wahren Ausdruck benutzen.

Dass jeder numerische Ausdruck, der einen Wert != 0 hat, als true verstanden wird, ist eine Sache. Eine ganz andere ist, dass der Compiler, wenn er den Wert für einen wahren boolschen Ausdruck ermittelt, immer 1 liefert. Ausdrücke wie (x < 0) sind entweder 0 oder 1, niemals etwas anderes. Oder der Compiler ist nicht standardkonform.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
30.08.2007, 07:09 Uhr
Tommix




Zitat von cfx:

Also ich kenne mich mit dem Compiler-Aufbau nicht aus, würde aber vermuten, der Datentyp ist intern irgendwo definiert und kann nicht ohne größeren Aufwand einfach nachprogrammiert werden.

So isses. Interne Datentypen kann man in C generell nicht so einfach nachbauen. Versuch' mal ein 24-Bit-Integer mit Vorzeichen zu konstruieren oder so was in der Art.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: