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

Я пытаюсь скомпилировать программный пакет C++, который был написан в 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?

8 ответов

Решение

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

 #include <stdint.h>

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

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

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

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

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

Другие ответы предполагают, что ваш компилятор совместим с C++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

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

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

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

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

как это:

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

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

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

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

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

using std::uint32_t;

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

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

Просто перейдите в /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;

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

Вам нужно включить iostream

#include <iostream>
using namespace std;
Другие вопросы по тегам