Недопустимый суффикс" -252 " для целочисленной константы

Я пытался запустить файл C из https://github.com/amree/mykad-c/blob/master/scdump.c, но я продолжаю получать Invalid suffix "-252" on integer constant в этой части кода:

        if (RxBuffer[0x11E-252] == 'P')
            printf("Femalen");
        else if (RxBuffer[0x11E-252] == 'L')
            printf("Malen");
        else
            printf("%cn", RxBuffer[0x11E-252]);

Я уверен, что это связано с синтаксисом. Но я действительно не понимаю код (я пытаюсь, но я в значительной степени застрял). Кто-нибудь может мне помочь?

2 ответов


0x11E-252

является шестнадцатеричной константой с плавающей запятой в C и -252 является экспоненциальной частью. Вы получаете предупреждение, потому что инициализируете целочисленный объект с константой float.

0x11E - 252  // Note the whitespace

- целочисленное выражение.

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

редактировать:

мой ответ на самом деле не так. Пока исправление в порядке, см. ответ от @MichaelBurr для реального объяснения что происходит. 0x11E-252 считывается как один токен по правилам C и не является допустимым плавающим (или целым) числом.


хотя эта проблема связана с шестнадцатеричными константами с плавающей запятой, основная причина проблемы не в том, что 0x11E является началом шестнадцатеричной плавающей константы (потому что это не начало шестнадцатеричной плавающей константы).

проблема в том, что 0x11E-252 - Это один токен вместо трех токенов, таких как 0x11F-252 есть. Если вы посмотрите на C99 6.4.8 "Preprocessing numbers", вы увидите, что маркер pp-number:

номер обработки начинается с цифра необязательно предшествует периоду (.)и может сопровождаться действительными символами идентификатора и последовательностями символов e+, e -, E+, E -, p+, p -, P+ или P-

и 0x11E-252 - Это один токен, и токенизация происходит на этапе перевода 3, но когда приходит время интерпретировать токен синтаксически и семантически (что происходит на этапе перевода 7), это не синтаксически допустимо, поэтому вы получаете ошибку компилятора.

С другой стороны, 0x11F-252 три жетона потому что - не является частью маркера номера предварительной обработки, если ему непосредственно не предшествует P или E (верхний или нижний регистр).

конечно, это связано с константами float (шестнадцатеричными или другими), потому что именно поэтому - символ может оказаться в середине маркера номера предварительной обработки. Однако обратите внимание, что вы получите аналогичные сообщения об ошибках для токенов, таких как 0xx11F или 22bad_token которые не имеют никакого сходства с шестнадцатеричной константой с плавающей запятой.

исправления как отметил ouah вставить пробел перед - чтобы заставить компилятор обрабатывать последовательность как несколько токенов. Если бы это был ваш код, еще лучшим решением было бы дать имена всем этим магическим числам (перечислениям или макросам). Затем идентификатор - не будет рассматриваться как один токен. Кроме того, вы, надеюсь, получите бонус за то, что сделаете код немного более самостоятельным документированием.