Частично отключить педантичные предупреждения в 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 }
};
(Конечно, это уродливо, и я изменил это на макрос прекомпилятора, но для теста это было приемлемо.)