Мне нужно было портировать проект для работы с Eclipse с собственным Makefile. Я изменил его make-файл и думаю, что ошибка связана с ним или с флагом компилятора.
Хост: Virtualbox Win 8, x64, целевое устройство: nrf51822, которое представляет собой arm cortex-m0. Я использую кросс-компилятор gnu arm 4.8.4 (GNU Tools ARM Embedded)
Компиляция показывает следующее сообщение об ошибке/предупреждении:
src/main.c:173:4: error: format '%u' expects argument of type 'unsigned int', but argument 3 has type 'uint32_t' [-Werror=format=]
Я этого не понимаю. uint32_t в данном случае — это unsigned int. Я включил stdint.h.
Я компилирую исходники со следующими флагами:
CFLAGS += -mcpu=cortex-m0 -mthumb -mabi=aapcs --std=gnu11 -funsigned-char -DNRF51 -DDEBUG_NRF_USER -DBLE_STACK_SUPPORT_REQD -DBOARD_PCA10000 -DNRF51822_QFAA_CA
CFLAGS += -Wall -Werror
CFLAGS += -mfloat-abi=soft
Разве -mcpu=cortex-m0 не указывает размер целого числа? Макросы препроцессора stdint.h должны генерировать «typedef unsigned int __uint32_t;». Eclipse показывает, что эта строка скомпилирована, но я не знаю, можно ли ей доверять, потому что внешний make-файл используется с собственным компилятором.
%u
дляuint32_t
не определено, даже если оно имеет тот же размер, что иunsigned int
. Таким образом, предупреждение может быть как-то оправдано (хотя его можно безопасно игнорировать). - person mafso   schedule 26.08.2014"%" PRIu32
вместо"%u"
. - person chux - Reinstate Monica   schedule 26.08.2014uint32_t
действительно определяется какunsigned int
, то они точно такого же типа. Я подозреваю, что OP ошибается иunsigned int
не 32 бита. Печатьsizeof(unsigned int)
подтвердит. - person Jim Balter   schedule 26.08.2014sizeof(unsigned int) * CHAR_BIT
подтвердит еще больше. - person chux - Reinstate Monica   schedule 26.08.2014sizeof(uint32_t) == sizeof(unsigned)
не означает, что они являются псевдонимами, они оба могут быть определениями типов для какого-то встроенного типа, как я читал стандарт, и они оба могут быть разными типами (аналогично тому, какchar
может быть какsigned char
, но другого типа). Мне любопытно, будет ли оправдано такое предупреждение даже на системах сsizeof(uint32_t) == sizeof(unsigned int)
... - person mafso   schedule 26.08.2014int
иunsigned int
являются соответствующими типами. Стандарт действительно допускает несколько несовместимых целочисленных типов одного и того же размера, хотя я не думаю, что что-то подобное существует, и это кажется плохой идеей. аналогично тому, как char может быть похож на подписанный char, но другого типа, но в стандарте говорится, что реализация должна определять char так, чтобы он имел тот же диапазон, представление и поведение, что и подписанный char или неподписанный char, поэтому передача любого из них в %c безопасно. - person Jim Balter   schedule 26.08.2014