Błąd kompilatora: memset nie został zadeklarowany w tym zakresie

101

Próbuję skompilować mój program w C w Ubuntu 9.10 (gcc 4.4.1).

Otrzymuję ten błąd:

Rect.cpp:344: error: memset was not declared in this scope

Ale problem polega na tym, że już umieściłem w moim pliku cpp:

#include <stdio.h>
#include <stdlib.h>

I ten sam program dobrze się kompiluje pod Ubuntu 8.04 (gcc 4.2.4).

Proszę, powiedz mi, czego mi brakuje.

Michael
źródło
2
Coś, czego nadal nie rozumiem, to dlaczego dobrze się kompiluje na starszych wersjach gcc i ubuntu, a nie na nowszych wersjach. Czy ktoś może wyjaśnić, dlaczego?
Dennis,
2
@Dennis: prawdopodobnie dlatego, że wymagany nagłówek <string.h>jest #includepośrednio d przez jakiś inny #includenagłówek d w twojej starszej konfiguracji gcc / Ubuntu.
Paul R
@Dennis Dodanie -fpermissive do opcji gcc może również pomóc w tych dziwnych przypadkach, chociaż jest to tylko obejście
emu

Odpowiedzi:

172

Powinieneś dołączyć <string.h>(lub jego odpowiednik w C ++ <cstring>).

sth
źródło
135

Kiedykolwiek napotkasz taki problem, po prostu przejdź do strony podręcznika dla danej funkcji, a dowiesz się, jakiego nagłówka brakuje, np.

$ man memset

MEMSET(3)                BSD Library Functions Manual                MEMSET(3)

NAME
     memset -- fill a byte string with a byte value

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <string.h>

     void *
     memset(void *b, int c, size_t len);

Zauważ, że dla C ++ lepiej jest używać odpowiednich równoważnych nagłówków C ++, <cstring>/ <cstdio>/ <cstdlib>/ etc, zamiast <string.h>/ <stdio.h>/ <stdlib.h>/ etc w C.

Paul R.
źródło
37
Wspaniały! Uczysz nas łowić, zamiast dawać nam rybę, kciuk w górę!
lukmac