Czy w C istnieje wartość true?
a.c:82:20: error: ‘true’ undeclared (first use in this function)
a.c:82:20: note: each undeclared identifier is reported only once for each function it appears in
Czy w C istnieje wartość true?
a.c:82:20: error: ‘true’ undeclared (first use in this function)
a.c:82:20: note: each undeclared identifier is reported only once for each function it appears in
W C nie istnieje w ogóle typ bool.
Możesz jednak na początku programu dodać (jednak nie wiadomo, czy to nie zwiększy niezadowolenia ew. innego programisty, czemu bool działa w C):
#define bool int
#define true 1
#define false 0
Dałem tak:
const int true = 1;
const int false = 0;
Właśnie coś mi świtało, że w C nie ma boolów.
bool oraz true i false istnieją w standardzie C, ale nie wszystkie kompilatory to wspierają. trzeba dodać nagłówek
#include <stdbool.h>
jeśli go nie ma, to znaczy że kompilator nie obsługuje.
jeśli chcesz samemu definiować, użyj raczej #define niż const.
Kiedyś stworzyłem sobie plik nagłówkowy (boolean.h):
#ifndef BOOLEAN_H
#define BOOLEAN_H
enum _bool {
false,
true
};
typedef enum _bool bool;
#endif // BOOLEAN_H
i od tamtej pory się bawię np tak:
#include "boolean.h"
// ...
int foo(char blah, bool bar);
bool yesno = true;
struct baz {
bool can_haz;
bool me_wants;
};
itp.
Oczywiście, #define jest najlepszym rozwiązaniem, ale czasami przydaje się kontrola typów ;)
Azarien napisał(a)
jeśli chcesz samemu definiować, użyj raczej #define niż const.
Dlaczego lepiej użyć
#define true 1
, niż const int true = 1;
?
Dlaczego lepiej użyć
#define true 1
, niż
const int true = 1;
?
Dlatego, że define oznacza stworzenie stałej czasu kompilacji: w każdym miejscu kodu gdzie wystąpitrue
, zostanie ono przed kompilacją zamienione na1
. dzięki temu wynikowy kod będzie tak samo wydajny jakby tam było po prostu 1.
const natomiast powoduje utworzenie „zmiennej” tyle że niezmiennej: zaalokowanie komórki w pamięci i wypełnienie jej wartością 1. Każde użycie takiegotrue
oznacza odwołanie się do tego miejsca w pamięci. Optymalizator kompilatora może, ale wcale nie musi kod uprościć do postaci z define.
Powyższe tyczy się języka C. w C++ const int true=1
stworzy stałą podobnie jak define. Kompilator C++ jednak może, jeśli uzna to za stosowne, dodatkowo zaalokować takiego consta jako zmienną.
w przypadku define
w obu językach mamy pewność, że zmienna utworzona nie będzie.
Zauważ, że jest to różnica między C a C++ nie mająca wpływu na kompatybilność kodu: zarówno const jak i define będzie działać w obu językach. Inne jest tylko podejście w kwestii optymalizacji.
Dodałbym jeszcze, że dzięki definom nie można zachwiać porzędkiem wszechświata i zmienić prawdy na fałsz. Inaczej mówiąc, niemożliwe byłoby przypadkowe zmienienie wartości prawdy na fałsz ;) (zmienienie wartości stałej - chociażby przez wskaźnik - to, przynajmniej w C++, UB - ale niestety prawdopodobnie by się skompilowało)
Jeszcze dodatkowym powodem za #define
w C jest to, że kiedyś w C nie było const
Prawda. Jest w nagłówku, ale takiego typu standardowo bez nagłówków nie ma
ściślej: jest jako _Bool
(czy jakoś tak) które to jest redefiniowane do bool
przez ten nagłówek.