web-dev-qa-db-ja.com

PRIu64がこのコードで機能しないのはなぜですか?

この答え に従って、_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"
_
25
Masked Man

私が自分のコードで見つけたこの問題のもう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.hUtil.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ツールチェーンで失敗しました。

18
Collin

C++では、ファイルをインクルードするだけではマクロは自動的に定義されません。

以下を追加する必要があります。

#define __STDC_FORMAT_MACROS 1

#include <inttypes.h>

どのようにuint64_tを印刷するか? "形式の誤った末尾の ‘%'で失敗します)

24
namaenashi

PRIu64は、使用する場所では定義されていません。

それを文字列"llu"に置き換えます。コードがコンパイルされます(ただし、修正ではなく、問題を示すだけです)。

おそらくincludeがありません。熱狂的な人にはガードが含まれていて、マジックトークンなしで含まれているため、defineがブロックされます。多分あなたのpchは逮捕されました。

Android JNIプラットフォームを使用している場合。これをAndroid.mkに入れます:

LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS
1
user18853