Błąd „nie znaleziono identyfikatora uint32_t”

96

Przenoszę kod z Linux C na Visual C ++ dla Windows.

Visual C ++ tego nie wie, #include <stdint.h>więc zakomentowałem to.

Później znalazłem wiele takich 'uint32_t': identifier not foundbłędów. Jak można to rozwiązać?

kevin
źródło
Które z nich komentujesz?
Daniel A. White
3
Których wersji programu Visual C ++ używasz? Te uint32_ti inne typy liczb całkowitych o dokładnej szerokości są tylko częścią C99 i C ++ 0x, więc starsze kompilatory (takie jak Visual C ++ 2008 i wcześniejsze) ich nie mają.
James McNellis,
Całkiem dużo !!! #include <stdint.h> #include <syslog.h> #include <linux / stddef.h> #include <pthread.h> #include <unistd.h> Dzięki !!!
kevin
Używam programu Visual C ++ express 2008.
kevin
4
@kevin: Nie możesz po prostu usunąć nagłówków specyficznych dla platformy i zapomnieć o nich. Musisz znaleźć alternatywy dla nowej platformy. Często wymaga to przepisania kodu, aby był przenośny.
Wyścigi lekkości na orbicie

Odpowiedzi:

115

Ten typ jest zdefiniowany w nagłówku C, <stdint.h>który jest częścią standardu C ++ 11, ale nie jest standardem w C ++ 03. Zgodnie ze stroną Wikipedii w nagłówku , nie był on dostarczany z programem Visual Studio do VS2010.

W międzyczasie prawdopodobnie możesz sfałszować własną wersję nagłówka, dodając typedefs, które mapują niestandardowe typy liczb całkowitych firmy Microsoft do typów oczekiwanych przez C. Na przykład:

typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
/* ... etc. ... */

Mam nadzieję że to pomoże!

templatetypedef
źródło
4
Możesz także użyć implementacji cstdint Boost.
Peter Huene
Kopiuję i wklejam twój kod na mojej stronie. Ale pokazuje ten błąd "błąd składni: brak ';' przed identyfikatorem „int32_t” ”i„ brak specyfikacji typu - założono int. Uwaga: C ++ nie obsługuje wartości default-int ”.
kevin
Przepraszam Peter, jestem nowy w C. Co to jest implementacja cstdint Boost?
kevin
3
Typy liczb całkowitych Microsoft o stałym rozmiarze nie kończą się literą „t”. Spróbuj po prostu __int32.
Ben Voigt
1
u_int32_ti uint32_tnie są tego samego typu; po znaku u. Wydaje się, że to osobny problem.
templatetypedef
79

Możesz #include <cstdint>. Jest częścią C ++ - standardu od 2011 roku.

Tigerle
źródło
1
Prawdopodobnie powinna to być akceptowana odpowiedź, biorąc pod uwagę ograniczenia pytania, takie jak C ++ i VS2010. Nie ma potrzeby przewracania własnych typów.
jww
7

Mam ten sam błąd i naprawiłem go włączając w pliku następujący

#include <stdint.h>

na początku pliku.

Nacho Barreto
źródło
1
Jak wskazano w pytaniu, stdint.h nie jest częścią kompilatora C ++, którego używa OP. Ta odpowiedź nie odpowiada na pytanie.
Niespodziewane
3

Na stronie projektu msinttypes dostępna jest implementacja - „Ten projekt wypełnia brak stdint.h i inttypes.h w Microsoft Visual Studio”.

Nie mam doświadczenia z tą implementacją, ale widziałem ją polecaną przez innych na SO.

Brandon Leiran
źródło
To lepsza i najczęściej używana implementacja.
Philippe Ombredanne
0

Musiałem uruchomić projekt w VS2010 i nie mogłem wprowadzić żadnych modyfikacji w kodzie. Moim rozwiązaniem była instalacja vS2013, aw VS2010 punkt VC ++ Directories-> IncludeDirectories to Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include. Wtedy mój projekt skompilował się bez żadnych problemów.

Darqer
źródło