Wartość true

0

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 
0

W C nie istnieje w ogóle typ bool.

0

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

0

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.

0

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 ;)

0
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;

?
0

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ąpi true, zostanie ono przed kompilacją zamienione na 1. 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 takiego true 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.

0

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)

0

Jeszcze dodatkowym powodem za #define w C jest to, że kiedyś w C nie było const

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1