C/Powszechne praktyki: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
** -> * |
revert |
||
Linia 7:
<source lang="c">
size_t size;
char *data;
}
struct string *create_string(const char *initial) {
assert (initial != NULL);
struct string *new_string = malloc(sizeof(*new_string));
if (new_string
new_string
}
return new_string;
}
Linia 25 ⟶ 26:
<source lang="c">
void free_string(struct string *s)
{
assert (s != NULL);
free(s
free(s); /* usuwamy samą strukturę */
}
</source>
Linia 37 ⟶ 40:
<source lang="c">
struct string;
void free_string(struct string *s);▼
▲ void free_string(string);
</source>
{{Porada|Jeśli znasz język [[C++]], mógłbyś użyć klas, a dzięki nim konstruktorów i destruktorów.}}
Linia 64 ⟶ 66:
<source lang="c">
void free_string(struct string **s)
{
assert(s != NULL && *s != NULL);
FREE((*s)->data); /* zwalniamy pamięć zajmowaną przez strukturę */
FREE(*s); /* usuwamy strukturę */
}
</source>
Linia 85 ⟶ 88:
#*'''Przykład:''' Definiujemy makro <code>#define suma(a, b) (a)+(b)</code> i wywołujemy je w kodzie <code>wynik = suma(3, 4) * 5</code>. Makro zostanie rozwinięte jako <code>wynik = (3)+(4)*5</code>, co - z powodu kolejności działań - da wynik inny niż pożądany.
# Jeśli makro składa się z wielu instrukcji lub deklaruje zmienne, powinno być umieszczone w pętli <code>'''do''' { ... } '''while'''(0)</code>, bez kończącego średnika. Pozwala to na użycie makra jak pojedynczej instrukcji w każdym miejscu, jak ciało innego wyrażenia, pozwalając jednocześnie na umieszczenie średnika po makrze bez tworzenia zerowego wyrażenia. Należy uważać, by zmienne w makrze potencjalnie nie kolidowały z argumentami makra.
#*Źle: <code>#define FREE(p) free(p); p = NULL;</code>
#*Dobrze: <code>#define FREE(p) do { free(p); p = NULL; } while(0)</code>
# Unikaj używania argumentów makra więcej niż raz wewnątrz makra. Może to spowodować kłopoty, gdy argument makra ma efekty uboczne (np. zawiera operator inkrementacji).
|