Почему 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"
Ответы
Ответ 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, что сделало ее еще более запутанной.
Ответ 2
В С++ макросы не определяются автоматически, только включив файл.
Вам нужно добавить следующее:
#define __STDC_FORMAT_MACROS 1
перед
#include <inttypes.h>
Как напечатать f uint64_t? Не удается: "ложный трейлинг" % в формате "
Ответ 3
PRIu64
не определяется, где вы его используете.
Замените его строкой "llu"
, и ваш код будет компилироваться (но это не исправление, оно просто демонстрирует проблему)
Может быть, include
отсутствует. Возможно, над фанатиком относятся охранники, и он включается без магического токена в блок define
. Возможно, ваш pch busted.