Частично отключить педантичные предупреждения в gcc внутри источника

Я пытаюсь получить gcc, чтобы заткнуться о моем использовании двоичных констант. Они делают код более читаемым, но не позволяют мне использовать -pedantic, который я соблюдаю в противном случае. Я хотел бы либо иметь такой переключатель, как -fnobinaryconstwarn или аналогичный (который, как я думаю, не существует после просмотра man-страницы какое-то время) или использовать

#pragma GCC diagnostic ignored "-pedantic" 

чтобы выборочно отключить педантичные предупреждения для короткого растяжения, как описано здесь: Выборочно отключить предупреждения GCC только для части единицы перевода? К сожалению, это не работает. Каковы мои варианты?

Для clang

#pragma GCC diagnostic ignored "-Wpedantic"

работает, а строка выше - нет, но она генерирует ошибку для gcc.

Ответ 1

возможно, вы можете использовать макрос, который может делать то, что вы хотите достичь переносимым образом. вот краткий пример:

#include <stdio.h>

#define BINARY(N) strtol(#N, 0, 2)

int main()
{
    unsigned int piece = BINARY(10010101);
    printf("%u\n", piece);

    return 0;
}

в теории, gcc должен иметь возможность оптимизировать вызовы strtol, и вы не теряете удобочитаемость.

EDIT: Кажется, что gcc не оптимизирует вызовы strtol на данный момент. Однако ваша потеря производительности должна быть незначительной.

Ура!

Ответ 2

Из руководства gcc по адресу: http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Alternate-Keywords.html#Alternate-Keywords

-патентные и другие параметры вызывают предупреждения для многих расширений GNU C. Вы можете предотвратить такие предупреждения в одном выражении, написав __extension__ перед выражением. __extension__ не влияет на это.

Я только что скомпилировал следующий блок с -Wall -Wextra -Wpedantic с gcc-4.8.2 и не было опубликовано предупреждение:

static uint8_t shbl[2][9] = {
{ __extension__ 0b11111111,
  __extension__ 0b11111110,
  __extension__ 0b11111100,
  __extension__ 0b11111000,
  __extension__ 0b11110000,
  __extension__ 0b11100000,
  __extension__ 0b11000000,
  __extension__ 0b10000000,
  __extension__ 0b00000000 },
// BLOCK_RIGHT
{ __extension__ 0b11111111,
  __extension__ 0b01111111,
  __extension__ 0b00111111,
  __extension__ 0b00011111,
  __extension__ 0b00001111,
  __extension__ 0b00000111,
  __extension__ 0b00000011,
  __extension__ 0b00000001,
  __extension__ 0b00000000 }
};

(Конечно, это уродливо, и я изменил это на макрос прекомпилятора, но для теста это было приемлемо.)