[C/C++] #define czy globalna zmienna typu const ???

0

Załużmy że mamy w programie jakąś wartość . Dla przykładu niech to będzie jakaś stała , np PI ( 3.1415926535897932384626 ) , oczywiście nie taka długa ( nie mamy tej wartość zdefiniowanej w żadnej bibliotece matematycznej ! ) . Tą wartość potrzebujemy w całym programie . Nie chce nam sie wszędzie wpisywać tej długiej wartości , tam gdzie jest potrzebna , tylko chcemy zmienić ją w jednym miejscu i zostanie to uwzględnione wszędzie indziej ( np jest gra , mamy kolor planszy , jest on wykorzystywany 100 razy w kodzie , a my chcemy go zmienić w jednym miejscu i nie latać po tych 100 innych ) .
Pozostają nam wyjścia :
#define kolor_planszy 15
lub
const int kolor_planszy=15; // jako zmienna globalna
Teraz w tych 100 miejscach wpisujemy tylko kolor_planszy i jak chcemy go zmienic , to zmieniamy jego wart tylko na poczatku kodu , w jednym miejscu . Tylko , że niezbyt milewidziane są te 2 sposoby .
Jakby co to który byście wybrali i dlaczego ??
Może znacie inne lepsze rozwiązanie ( żadne składowe klas !! ) ??

0

const

0

const

to bedzie ja mogl wtedy zmienic?

dopisane:
no, a ja rozumiem ze Autor chce miec mozliwosc edycji jej wartosci podczas dzialania programu.

znowu dopisane:
aha, to w takim wypadku const :).

0

to bedzie ja mogl wtedy zmienic?

Nie.

0

ta wartosc ma byc stala w programie , tylko po zmienieniu w jednym miejscu w kodzie ma sie zmienic wszedzie indziej

0

oczywiscie ze wartosc const mozna zmieniac ale tylko z poziomu edycji kodu i o to wydaje mi sie tobie chodzi, jesli chodzi o moj punkt widzenia to ja zawsze przy jakimkolwiek projekcie robie sobie plik : def.h w ktorym to mam wszystkie zmienne globalne tudziez uwagi do ustawien,to czy uzyc const int / a int to zalezy od programisty bo po co definiowac kolor czegos tam jako const? przeciez mozna go np zmienic w trakcie dzialania programu ... taka moja sugestia

0

Algor TrOuBLE chyba chobziło o to, że niechce zmieniać wartości podczas działania programu tylko przed kompilacją, on chciał się dowiedzieć co jest lepiej stosować (naszym zdaniem) #define czy np: const int zmienna=1; .
Jeżeli masz mało tych stałych wartości to można #define, tak byłem uczony, choć niewidze żadnej (potencjalnej) różnicy jeżeli napiszemy 100 razy #define zamiast twożyć zmienne globalne z modyfikatorem const (choć oczywiście moge się mylić). Osobiście nie nadużywał bym #define ponieważ ma większe możliwości niż zmienne globalne (np: pisanie makr). Ale wybór należy do ciebie.

0

masz racje szwagier i tylko potwierdzasz moje zdanie (moim zdaniem hehe), natomiast z tym def.h chodzilo mi o dobry nawyk,poniewaz wnioskuje ze w/w problem dotyczy w miare zlozonych projektow bo jesli mowimy o 30 linijkach kodu to ja prawie nie widze roznicy jak sie to zadeklaruje i gdzie,to tyle

natomiast wg mnie (a moge sie mylic) podstawowa roznica midzy
#define a const costam polega na tym ze w zaleznosci od kompilatora mozemy ciutke zaoszczedzic miejsca np w bc31 (o ile mi wiadomo)
#define kolor 15 - kopmilator zapisuje to w 2bajtach czyli int
a mozna w zaleznosci od zastosowan const char kolor = 15;
i w wiekszosci wypadkow bedzie ok, a zaoszcedzimy az 1 bajt(slownie:
jeden bajt hehe)
taka to subtelna roznica

ale nie mam zadnej knigi pod reka teraz wiec powtarzam moge sie mylic

0

jak zdefiniujemy coś dyrektywą preprocesora ( czy coś w tym stylu ;) ) #define , to to nic w pamieci nie zajmie . jak sie napisze np #define n 20 , to kompilator wszedzie tam gdzie w kodzie jest 'n' wpisze liczbe 20 ...

0

jak zdefiniujemy coś dyrektywą preprocesora ( czy coś w tym stylu ;) ) #define , to to nic w pamieci nie zajmie . jak sie napisze np #define n 20 , to kompilator wszedzie tam gdzie w kodzie jest 'n' wpisze liczbe 20 ...

tak masz racje teraz sobie przypomnialem (ale plama) sorka

0

heh to bylem ja Algor ^ tylko z innego kompa i sie nie zalogowalem
(adminy nie wsciekajcie sie bo nie mam mozliwosci edycji mojego posta bo jest anonim)

tak przy okazji to natknelem sie na jednej z moich ulubionych stron na cos takiego :

Osoby mające doświadczenie w kodowaniu w C często piszą

#define COUNT 50

albo
#define MAX(a,b) (a > b ? a : b)

Zapisy tego typu sprawiają jednak problemy - najpoważniejszym są problemy z kompilacją, które sprawiamy użytkownikom naszego kodu. Wyobraźmy sobie, że ktoś po dołączeniu naszego nagłówka będzie chciał zdefiniować własną stałą, funkcję czy metodę o nazwie MAX lub COUNT. W przypadku makr z parametrami zdarzają się też subtelniejsze problemy, wyobraźmy sobie, że ktoś napisał

MAX(++a, ++b);

Nie ma też żadnej kontroli typów.
Pisząc w C++, w większości przypadków możemy zastąpić makra równie wydajnymi ale bezpiecznymi instrukcjami tego języka. Dla przykładu

const int COUNT = 50;

oraz
template
inline MAX(const ParamType& left, const ParamType& right)
{
return left > right ? left : right;
}

Funkcje inline mają tą miłą cechę, że o ile w kodzie produkcyjnym (release) są rozwijane w miejscu wywołania tak samo jak makra (a więc równie wydajne), o tyle w wersjach debug mogą zostać zachowane jako niezależne wywołania (co pozwala np. umieścić w nich breakpoint).

mysle , ze to wyczerpuje ten temat

0

Trzeba być samobójcą żeby napisać :
#define MAX(a,b) (a > b ? a : b)
;)
Jeśłi chodzi o #define to chodziło mi o zastosowanie tej dyrektywy tylko i wyłącznie do przechowywania stałej wartości
Zgadzam sie że przy #define nie ma kontroli typów , to chyba jedyny minus .
A co do tej funkcji :

template
inline MAX(const ParamType& left, const ParamType& right)
{
return left > right ? left : right;
}

to mam pytanie : po co używamy tutaj referencji ?? przecież wystarczy nam sama wartość . co daje to template i co to za dziwne typy agrumentów ;) rozumiem że ta funkcja zostaje po prostu wklejona do kodu przed kompilacja z odpowiednimi argumentami , czyli jak przekażemy inty to operuje na intach ?? a jak przekażemy double to na double ??
i gdy np w kodzie mamy :
MAX(a,b);
to to zostanie zastąpione :
return a > b ? a : b;
czy może :
return left > right ? left : right;
??
ale przecież nie mamy stworzonych referencji left i right , one istnieją tylko w funkcji ... więc chyba raczej to pierwsze ...
??? [glowa]
I mógłbyś mi przetłumaczyć to na język początkującego programisty ?? :
<font color="green">Funkcje inline mają tą miłą cechę, że o ile w kodzie produkcyjnym (release) są rozwijane w miejscu wywołania tak samo jak makra (a więc równie wydajne), o tyle w wersjach debug mogą zostać zachowane jako niezależne wywołania (co pozwala np. umieścić w nich breakpoint). </span>
;)
Jesli sie nie myle , to definiujac funkcje jako inline , zaoszczedzamy skokow do tej funkcji w czasie jej wywolania , program dziala o wiele szbciej bo nie musi za kazdym razem szukac jej po pamieci . ale z drugiej strony kod zajmuje wiecej miejsca . mam racje ? w takim razie trzeba wybrac to co sie bardziej oplaca ...

0

Masz racje, program napisany na funkcjach inline będzie szybciej działał ale sam kod będzie się dłużej kompilował.

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