'uint32_t' не называет тип

Я пытаюсь скомпилировать программный пакет С++, который был написан в 2007 году, и я получаю эту ошибку:

error: ‘uint32_t’ does not name a type

Это происходит в 64-битном Ubuntu, используя g++ 4.5.2. Он отлично компилируется в 64-битном CentOS, используя g++ 4.1.2.

Есть ли #include или флаг компилятора, который мне не хватает? Или, следует ли использовать typedef для назначения uint32_t size_t или, возможно, unsigned int?

Ответ 1

Вам нужно включить stdint.h

 #include <stdint.h>

Ответ 2

Вам нужно #include <cstdint>, но это может не всегда работать.

Проблема заключается в том, что некоторые компиляторы часто автоматически экспортируют имена, определенные в разных заголовках или предоставленных типах, до того, как такие стандарты были на месте.

Теперь я сказал, что "может не всегда работать". Это потому, что заголовок cstdint является частью стандарта С++ 11 и не всегда доступен для текущих компиляторов С++ (но часто это бывает). Заголовок stdint.h является эквивалентом C и является частью C99.

Для лучшей переносимости я бы рекомендовал использовать заголовок Boost boost/cstdint.hpp, если вы хотите использовать boost. В противном случае вы, вероятно, сможете уйти С# include'ing <cstdint>.

Ответ 3

Я также столкнулся с той же проблемой в Mac OSX 10.6.8 и, к сожалению, добавив #include <stdint.h> или <cstdint.h> в соответствующий файл, я не решил свою проблему. Однако после большего поиска я нашел это решение, предлагающее добавить #include <sys/types.h>, который хорошо работал у меня!

Ответ 4

Другие ответы предполагают, что ваш компилятор совместим с С++ 11. Это нормально, если это так. Но что, если вы используете старый компилятор?

Я взял следующий хак где-то в сети. Он работает достаточно хорошо для меня:

  #if defined __UINT32_MAX__ or UINT32_MAX
  #include <inttypes.h>
  #else
  typedef unsigned char uint8_t;
  typedef unsigned short uint16_t;
  typedef unsigned long uint32_t;
  typedef unsigned long long uint64_t;
  #endif

Конечно, он не переносится. Но это может сработать для вашего компилятора.

Ответ 5

Добавьте в файл base.mk следующее. Следующая 3-я строка важна -include $(TOP)/defs.mk

CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings 
CFLAGS_C=-Wmissing-prototypes
CFLAGS_CXX=-std=c++0x
LDFLAGS=
LIBS=

чтобы избежать #error Этот файл требует поддержки компилятора и библиотеки для предстоящего стандарта ISO С++, С++ 0x. Эта поддержка в настоящее время является экспериментальной и должна быть включена с параметрами -std = С++ 0x или -std = gnu ++ 0x

Ответ 6

если это произошло, когда вы включаете заголовок opencv.

Я бы рекомендовал изменить порядок заголовков.

поместите заголовки opencv чуть ниже стандартного заголовка С++.

вот так:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

Ответ 7

У меня была та же проблема, которая пыталась скомпилировать lib, загружаемую из Интернета. В моем случае в коде уже был #include <cstdint>. Я решил, что добавил:

using std::uint32_t;

Ответ 8

Добавьте в файл base.mk следующее. Следующая 3-я строка важна - включите $(TOP)/defs.mk

CXXFLAGS = -g -std=c++11 -O3 -W -Wall -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long $(THREADSCXXFLAGS)

Ответ 9

просто перейдите в /usr/include/x86_64-linux-gnu/bits откройте stdint-uintn.h и добавьте эти строки

typedef __uint8_t uint8_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;

снова откройте stdint-intn.h и добавьте

typedef __int8_t int8_t;
typedef __int16_t int16_t;
typedef __int32_t int32_t;
typedef __int64_t int64_t;

обратите внимание, что эти строки уже присутствуют, просто скопируйте и добавьте недостающие строки.

Ответ 10

Вы должны включить iostream

#include <iostream>
using namespace std;