web-dev-qa-db-ja.com

'uint32_t'はタイプに名前を付けません

2007年に作成されたC++ソフトウェアパッケージをコンパイルしようとしていますが、このエラーが発生しています。

error: ‘uint32_t’ does not name a type

これは、g ++ 4.5.2を使用する64ビットUbuntuで発生しています。 g ++ 4.1.2を使用して64ビットCentOSで正常にコンパイルします。

欠落している#includeまたはコンパイラフラグはありますか?または、typedefを使用してuint32_tsize_tまたはunsigned intに割り当てる必要がありますか?

64
rmtheis

Stdint.hを含める必要があります

 #include <stdint.h>
127
selbie

#include <cstdint>が必要ですが、それが常に機能するとは限りません。

問題は、さまざまなヘッダーで定義された名前または提供されたタイプが、そのような標準が導入される前に、一部のコンパイラがしばしば自動的にエクスポートすることです。

今、私は「いつもうまくいくとは限らない」と言った。これは、cstdintヘッダーがC++ 11標準の一部であり、現在のC++コンパイラで常に使用できるとは限らないためです(多くの場合使用可能です)。 stdint.hヘッダーはCに相当し、C99の一部です。

最適な移植性を得るために、Boostを使用する場合は、Boostのboost/cstdint.hppヘッダーを使用することをお勧めします。そうでなければ、おそらく#include'ing <cstdint>で逃げることができるでしょう。

31
plasma

Mac OSX 10.6.8でも同じ問題が発生しましたが、残念ながら#include <stdint.h>または<cstdint.h>を対応するファイルに追加しても問題は解決しませんでした。しかし、さらに検索した結果、このソリューションが#include <sys/types.h>の追加を推奨していることがわかりました。

9
patti_jane

他の回答は、コンパイラが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

もちろん、ポータブルではありません。しかし、それはあなたのコンパイラのために働くかもしれません。

5
Daniel Lemire

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 C++標準であるC++ 0xのコンパイラとライブラリのサポートが必要です。このサポートは現在実験的であり、-std = c ++ 0xまたは-std = gnu ++ 0xコンパイラオプションで有効にする必要があります

1
gowriganesh

インターネットからダウンロードしたライブラリをコンパイルしようとすると、同じ問題が発生しました。私の場合、コードにはすでに#include <cstdint>がありました。私はそれを解決して:

using std::uint32_t;
1
Daniel

opencvヘッダーをインクルードしたときに発生した場合。

ヘッダーの順序を変更することをお勧めします。

opencvヘッダーを標準C++ヘッダーのすぐ下に配置します。

このような:

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