この答え に従って、_uint64_t
_を印刷しようとしましたが、エラーが発生しました:
エラー:「PRIu64」の前に「)」が必要です
以下は、私がやろうとしていることを示す最小限のコードです:
_#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <cstdio>
class X {
X() {
uint64_t foo = 0;
printf("%07" PRIu64 ": ", foo);
}
};
int main() {}
_
この最小限のコードはコンパイルされますが、実際のコードはコンパイルされません。ただし、実際のコードとまったく同じX::X()
内の2行を試してみましたが、機能しません。
これをさらにデバッグするには何を探す必要がありますか?私の実際のコードは他のヘッダーも_#include
_ sしています。それが問題の原因ですか?ヘッダーを含める順序は重要ですか?
Edit_PRIu64
_は私のマシンで次のように定義されています:
_# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# define __PRIPTR_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# define __PRIPTR_PREFIX
# endif
# define PRIu64 __PRI64_PREFIX "u"
_
私が自分のコードで見つけたこの問題のもう1つの可能性は、別のヘッダーがすでに<inttypes.h>
beforeをプルインしているかどうかです__STDC_FORMAT_MACROS
。例えば:
tils.h(おそらく、もともとC向けに記述されていたため、今回のケースのように):
#include <inttypes.h>
// ... Function declarations
MyFile.cpp:
#include "Utils.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
inttypes.h
はUtil.h
によってすでにインクルードされているため、コンパイラーは再度インクルードせず、__STDC_FORMAT_MACROS
の宣言を表示しません。
解決策は、Utils.h
を編集して#define __STDC_FORMAT_MACROS
を含めるか、MyFile.cpp
でインクルードする前に定義することです。
#define __STDC_FORMAT_MACROS
#include "Utils.h"
#include <inttypes.h>
元のセットアップは実際にはUbuntuのGCC 4.8で問題なくコンパイルされましたが、PowerPC用の古いltib GCC 4.3ツールチェーンで失敗しました。
C++では、ファイルをインクルードするだけではマクロは自動的に定義されません。
以下を追加する必要があります。
#define __STDC_FORMAT_MACROS 1
前
#include <inttypes.h>
PRIu64
は、使用する場所では定義されていません。
それを文字列"llu"
に置き換えます。コードがコンパイルされます(ただし、修正ではなく、問題を示すだけです)。
おそらくinclude
がありません。熱狂的な人にはガードが含まれていて、マジックトークンなしで含まれているため、define
がブロックされます。多分あなたのpchは逮捕されました。
Android JNIプラットフォームを使用している場合。これをAndroid.mkに入れます:
LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS