Недопустимый суффикс" -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 вставить пробел перед -
чтобы заставить компилятор обрабатывать последовательность как несколько токенов. Если бы это был ваш код, еще лучшим решением было бы дать имена всем этим магическим числам (перечислениям или макросам). Затем идентификатор -
не будет рассматриваться как один токен. Кроме того, вы, надеюсь, получите бонус за то, что сделаете код немного более самостоятельным документированием.