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 takiegotrueoznacza 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.