C/Powszechne praktyki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
** -> *
Lethern (dyskusja | edycje)
revert
Linia 7:
 
<source lang="c">
typedef struct string {
size_t size;
char *data;
} string;
struct string *create_string(const char *initial) {
assert (initial != NULL);
struct string *new_string = malloc(sizeof(*new_string));
if (new_string.size != strlen(initialNULL); {
new_string.data->size = malloc(strlen(initial));
strcpy( new_string.->data, = strdup(initial);
}
return new_string;
}
Linia 25 ⟶ 26:
 
<source lang="c">
void free_string(struct string *s)
{
assert (s != NULL);
free(s.->data); /* zwalniamy pamięć zajmowaną przez strukturę */
free(s); /* usuwamy samą strukturę */
}
</source>
Linia 37 ⟶ 40:
<source lang="c">
struct string;
typedef struct string string*create_string(const char *initial);
void free_string(struct string *s);
string create_string(const char*);
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).