31

この回答に従って、を印刷しようとしました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() {}

この最小限のコードはコンパイルされますが、私の実際のコードはコンパイルされません。ただし、実際のコードで2行をまったく同じように試しましたが、X::X()機能しません。

これをさらにデバッグするには、何を探す必要がありますか?私の実際のコードには#include他のヘッダーもあります。それが問題を引き起こしている可能性がありますか?ヘッダーを含める順序は重要ですか?

私のマシンでは、編集 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"
4

4 に答える 4

28

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

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

#define __STDC_FORMAT_MACROS 1

#include <inttypes.h>

f uint64_tを印刷するには? 次のエラーで失敗します: 「形式に間違った末尾の '%' があります」

于 2013-09-10T12:38:37.883 に答える
24

自分のコードで見つけたこの問題のもう 1 つの可能性は、定義する<inttypes.h> 前に__STDC_FORMAT_MACROS別のヘッダーが既に取り込まれている場合です。例えば:

Utils.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して includeするか、 で include#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 ツールチェーンで失敗したため、最初はさらに複雑になりました。

于 2015-06-15T17:22:03.047 に答える
4

PRIu64どこで使用するかは定義されていません。

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

が欠けているのかもしれませんinclude。たぶん、熱心すぎる人にはガードが含まれており、マジックトークンブロックなしで含まれているdefine. 多分あなたのpchは逮捕されました。

于 2013-01-26T10:27:26.933 に答える