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


79

Я намагаюся скомпілювати програмний пакет 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_ta size_tчи, можливо, an unsigned int?


5
Шукайте заголовки stdint.h або <cstdint>. Цей тип є (наскільки я розумію) частиною C99, але не потрапив у C ++.
Mike C

3
Ти що #include <stdint.h>? Схоже на можливу помилку в 64-розрядному Ubuntu. Крім того, чи є у вас -std=c++98такий параметр командного рядка для gcc? Якщо так, чи можете ви перевірити, чи він добре компілюється, якщо ви використовуєте -std=gnu++98?
dirkgently

@dirkgently я перевірив Makefile, і stdваріантів не було .
rmtheis

@ user667810: Це за замовчуванням розширення GNU та режим C ++ 98.
dirkgently

Відповіді:


157

Вам потрібно включити stdint.h

 #include <stdint.h>

58
"Правильним" заголовком C ++ буде cstdint.
paxdiablo

1
Зверніть увагу, у моєму випадку проблема була насправді в тому, що включення boost/cstdint.hppне було знайдено. yum install boost-develвиправив мою справу.
snooze92

@paxdiablo не повинен бути cstdint.h включений до зовнішнього блоку "C" {}?
StarShine

@paxdiablo "правильний" заголовок дав мені "#error Цей файл вимагає підтримки компілятора та бібліотеки стандарту ISO C ++ 2011. Ця підтримка наразі експериментальна ..." Так, так, слід оновити, але це величезна стара програма, яка ледве потрапив у 64-розрядний світ.
brewmanz

А як щодо CGCC?
Рої

34

Вам потрібно #include <cstdint>, але це може не завжди спрацювати.

Проблема полягає в тому, що якийсь компілятор часто автоматично експортує імена, визначені в різних заголовках або наданих типах, перш ніж такі стандарти існували.

Зараз я сказав, що "можливо, не завжди вдасться". Це тому, що заголовок cstdint є частиною стандарту C ++ 11 і не завжди доступний на поточних компіляторах C ++ (але часто є). Заголовок stdint.h є еквівалентом C і є частиною C99.

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


Це дало мені#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
rmtheis

1
Правильно, як там сказано, cstdint є частиною нового стандарту C ++ (який називався C ++ 0x, але офіційно не є C ++ 11. Отже, щоб використовувати цей заголовок, потрібно ввімкнути новий стандарт у g ++. Як Я сказав, що найкращий портативний спосіб отримати ці типи - використовувати Boost або інший еквівалентний заголовок, а не покладатися на підтримку компілятора.
plasma

9

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


6

Інші відповіді передбачають, що ваш компілятор відповідає 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

Звичайно, це не портативно. Але це може працювати для вашого компілятора.


Вони потрібні для драйвера ядра (C), він компілюється! Дякую
DreTaX

2

якщо це сталося при включенні заголовка opencv.

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

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

подобається це:

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

Яке відношення це має до opencv? Це дуже загальна помилка, яка трапляється за багатьох обставин.
EntangledLoops

1

Додайте наступне у файл base.mk. Наступний 3-й рядок важливий -include $(TOP)/defs.mk

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

щоб уникнути # помилки Цей файл вимагає підтримки компілятора та бібліотеки для майбутнього стандарту ISO C ++, C ++ 0x. Наразі ця підтримка є експериментальною, і її потрібно ввімкнути за допомогою параметрів компілятора -std = c ++ 0x або -std = gnu ++ 0x


1
Питання не говорить, чи використовується Make. Більш портативна відповідь просто скаже, які прапори передавати компілятору (і який компілятор ви передбачаєте).
Тобі Спейт

1

У мене була та сама проблема, коли я намагався скласти бібліотеку, яку завантажую з Інтернету. У моєму випадку #include <cstdint>в коді вже було. Я вирішив це, додавши:

using std::uint32_t;

1
@Daniel Вам все ще потрібен #includeправильний заголовок, перш ніж ви зможете отримати доступ до типу.
cbr

Так, #includeце потрібно. Я не сказав, що це не так. Але оскільки в моєму випадку це було #include <cstdint>, а такого не було using namespace std, компілятор не зміг визначити ім'я uint32_t. Тож саме тому мені довелося додатиusing std::uint32_t;
Даніеля

0

просто перейдіть до / usr / include / x86_64-linux-gnu / bits open 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;

Зверніть увагу, що ці рядки вже присутні, просто скопіюйте і додайте пропущені рядки веселіше ..


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.