Ошибка строки формата GCC колеблется между двумя «указанием формата ... но аргумент имеет значения типа ...», ни одному из них не нравится - PullRequest
0 голосов
/ 14 февраля 2019

У меня странная проблема с компиляцией: код

typedef struct {
unsigned int         len;
unsigned char          value[1];
} __attribute__((packed)) value_t; 
typedef struct {
unsigned int         len;
unsigned char          msg_type;
unsigned short         ret_val;
unsigned long long         timestamp;
value_t         working_val;
} __attribute__((packed)) resp_t;
...
logd("sizeof(resp_t) = %u", sizeof(resp_t));
// logd macro expands to __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)

выдает ошибку:

error: format specifies type 'unsigned int' but the argument has type 'unsigned long'

Это кажется странным, поскольку упакованная структура, скомпилированная для arm64 Android, должна толькобыть 28 байтов (я думаю), который легко помещается в целое число без знака, поэтому я ожидал бы, что sizeof вернет целочисленный тип без знака.Даже если бы они не были упакованы, я бы ожидал, что sizeof вернет целочисленный тип без знака, чтобы содержать их, так как они довольно минимальные структуры.В любом случае, я изменил код на:

logd("sizeof(resp_t) = %lu", sizeof(resp_t));

, и теперь я вижу обратную ошибку:

 error: format specifies type 'unsigned long' but the argument has type 'unsigned int'

Переключение кода снова приводит к исходной ошибке.Что здесь происходит?

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете использовать %z

logd("%zu\n", sizeof(x)); /* for size_t */
logd("%zd\n", sizeof(x)); /* for ssize_t */ 

%z был добавлен в C99.В случае, если вы используете MSVC, который не поддерживает ни один из более поздних стандартов C, правильный префикс для size_t правильный префикс %Iu

Редактировать: Как @Weather Vane правильноуказал MSVC теперь поддерживает %Iu.Субъект также рассматривался здесь

...