Как остановить компилятор от принятия восьмеричного числа?

#gcc

#gcc

Вопрос:

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

 pa_result[06] = pa_positive[06] - pa_negative[06];
pa_result[07] = pa_positive[07] - pa_negative[07];
pa_result[08] = pa_positive[08] - pa_negative[08];  //<--terrible things
pa_result[09] = pa_positive[09] - pa_negative[09];  //<--terrible things
pa_result[10] = pa_positive[10] - pa_negative[10];
pa_result[11] = pa_positive[11] - pa_negative[11];
  

Компилятор видит 08 и 09 и принимает восьмеричное число. Однако он не делает таких предположений для любого другого числа.

Есть ли префикс для указания «не восьмеричный»? (кроме того, почему только с 08 и 09 )

Комментарии:

1. Учитывая, что стандартным поведением является принятие восьмеричного числа в числах с префиксом 0, я не могу представить, чтобы компилятор изменил это на что-то несоответствующее. С учетом сказанного, я бы ожидал, что компилятор, по крайней мере, предупредит об этом.

2. @E_net4 он предупреждает только о двух из них. Я заметил это только сегодня, потому что я перешел от 0-7 записей к 0-16. gcc не предупреждает до 08 . Итак, я думаю, что я просто введу пробел вместо 0. Я использовал i в коде, который его сгенерировал.

Ответ №1:

Ноль 0 в качестве начального символа в числе — это стандартный способ C определить, что за ним следует восьмеричное число. Единственная причина, по которой 08 и 09 выдает ошибку, заключается в том, что это недопустимые восьмеричные числа. 01 07 все ли допустимые восьмеричные числа представляют те же десятичные числа 1-7, которые вы ожидаете. Это по той же причине, по которой шестнадцатеричные числа 0x0 0x9 выглядят так же, как десятичные числа от 0 до 9, при условии, что вы игнорируете, 0x что указывает на то, что за ними следуют шестнадцатеричные цифры.

Однако 8 и 9 не являются допустимыми восьмеричными цифрами, точно так же, как A не являются допустимой десятичной цифрой, хотя в шестнадцатеричном формате это совершенно нормально, представляя десятичное число 10.

Вам нужно будет удалить начальный ноль 0 , чтобы они считались десятичными числами и работали должным образом.