C -Wormat предупреждение для целочисленного продвижения в printf - PullRequest
0 голосов
/ 10 сентября 2018

Я использую GCC 5.2.1 с ARM Cortex A9 и компилирую с -std = c11 и -Wformat-signatureness.

Как избежать предупреждения -Wormat в этом случае?

int main()
{
    enum
    {
        A = 0,
        B
    };
    char buff[100];
    snprintf(buff, 100, "Value is 0x%04x\n", A);
    return 0;
}

Это выдает предупреждение:

format '%x' expects argument of type 'unsigned int', but argument 4 has
  type 'int' [-Werror=format=]
    snprintf(buff, 100, "Value is 0x%04x\n", A);
                        ^

Явное приведение дает тот же результат:

format '%x' expects argument of type 'unsigned int', but argument 4 has 
  type 'int' [-Werror=format=]
    snprintf(buff, 100, "Value is 0x%04x\n", (uint16_t)A);
                        ^

1 Ответ

0 голосов
/ 10 сентября 2018

Как избежать предупреждения -Wformat в этом случае?

Приведите перечислимый тип к unsigned, чтобы соответствовать "%x".

// snprintf(buff, 100, "Value is 0x%04x\n", A);
snprintf(buff, 100, "Value is 0x%04x\n", (unsigned) A);

o,u,x,X Аргумент unsigned int преобразуется в ... C11 §7.21.6.1 8


Если код приведен к чему-то отличному от unsigned, по какой-то причине , используйте указанный соответствующий спецификатор печати. @ Chrono Kitsune

#include <inttypes.h> 

// snprintf(buff, 100, "Value is 0x%04x\n", (uint16_t)A);
snprintf(buff, 100, "Value is 0x%04" PRIX16 "\n", (uint16_t)A);

Мораль, если история: Используйте соответствующие спецификаторы печати с каждым аргументом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...