Включение long long в C89 при G CC 3.2, 4.4 и 5.4 - PullRequest
0 голосов
/ 03 августа 2020

Я работаю в C89 в довольно ограниченной среде. Я должен писать для компилятора на основе G CC 4.4, но мой код также должен проходить тесты, скомпилированные с G CC 3.2. Наш компилятор для повседневной разработки - G CC 5.4. Для моих денег это звучит безумно, но это те карты, которые мне выдали.

Поскольку нам требуются 64-битные целые числа, мы пошли на ослабление правил C89, чтобы используйте long long. Наш исходный код решает проблему следующим образом:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"
typedef unsigned long long my_type
#pragma GCC diagnostic pop

К сожалению, это не работает с G CC 4.4, поскольку операции pu sh и pop были введены в G CC 4.6. , поэтому я изменил его на:

#pragma GCC diagnostic ignored "-Wlong-long"
typedef unsigned long long my_type
#pragma GCC diagnostic error "-Wlong-long"

Увы, G CC 3.2 не любит:

warning: ignoring #pragma GCC diagnostic
ISO C89 does not support `long long'
warning: ignoring #pragma GCC diagnostic

Видя, что он скомпилирован с -Wunknown-pragmas, подозреваю, что #pragma GCC diagnostic не существовало на момент выпуска G CC 3.2.

Кто-нибудь может предложить решение, пожалуйста?

1 Ответ

1 голос
/ 03 августа 2020

Если вам нужен c89 по какой-то причине, попытка подорвать его с помощью странных хаков компилятора вряд ли в чьих-либо интересах. Вы можете определить свой тип:

typedef struct { unsigned _[2]; } my_type;

Затем напишите соответствующие операции либо в C, либо в asm, например:

my_type MyAdd(my_type a, my_type b);
my_type MySub(my_type a, my_type b);
...

Когда-нибудь, если вам разрешат более новую версию C, это простое обновление.

...