Почему PRIu64 не работает в этом коде? - программирование
Подтвердить что ты не робот

Почему PRIu64 не работает в этом коде?

В соответствии с этим ответом я попробовал распечатать uint64_t, но это дает мне ошибку:

error: ожидается ``) 'перед' 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 других заголовков. Может ли это вызвать проблему? Имеет ли смысл включать заголовки?

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"
4b9b3361

Ответ 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, чтобы включить #define __STDC_FORMAT_MACROS, или чтобы определить его, прежде чем делать какие-либо включения в MyFile.cpp.

#define __STDC_FORMAT_MACROS
#include "Utils.h"
#include <inttypes.h>

Первоначальная настройка на самом деле скомпилирована на GCC 4.8 на Ubuntu, но с неудачной старинной инструментальной привязкой для лининга GCC 4.3 для PowerPC, что сделало ее еще более запутанной.

Ответ 3

PRIu64 не определяется, где вы его используете.

Замените его строкой "llu", и ваш код будет компилироваться (но это не исправление, оно просто демонстрирует проблему)

Может быть, include отсутствует. Возможно, над фанатиком относятся охранники, и он включается без магического токена в блок define. Возможно, ваш pch busted.