ошибка: ожидается '=', ',', ';', 'asm' или '__attribute__' перед [функция]

У меня возникла проблема с компилятором PIC32 версии 2.02.

Компилятор определяет тип BOOL следующим образом:

typedef enum _BOOL { FALSE = 0, TRUE } BOOL;     // BOOL Type

Я хочу вернуть одно из перечисленных значений в такой функции:

BOOL
MyFunction(void)
{
  if( PortAvailable() )
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}

когда я компилирую свой код, я получаю эту ошибку, предшествующую "MyFunction":

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'MyFunction'

Я обновляю свой компилятор с версии 1.05 до версии 2.02, где я создал свой собственный тип BOOL. Код работал нормально до попытки использовать версию 2.02. (Да, я удалил определение типа BOOL из кода).

Что-то, что я нахожу очень странным, это если я делаю функцию так:

enum BOOL
MyFunction(void)
{
  if( PortAvailable() )
  {
    return TRUE;
  }
  else
  {
    return FALSE;
  }
}

компилятор не дает мне ошибку выше. Правильно ли я использую перечисленный BOOL или кто-нибудь знает о шаге, который я пропустил?


person R. Johnson    schedule 05.07.2016    source источник
comment
Что идет непосредственно перед определением MyFunction в коде?   -  person jwodder    schedule 05.07.2016
comment
Другая функция, но с возвратом void.**void Initialize(void);** Я забыл упомянуть, что эти ошибки всегда относятся к заголовочному файлу, а не к основному c-файлу.   -  person R. Johnson    schedule 05.07.2016
comment
Если ошибки возникают в заголовочном файле, то они не возникают в коде, который вы здесь показали, не так ли? Пожалуйста, опубликуйте фактический код, который генерирует ошибку.   -  person jwodder    schedule 05.07.2016
comment
Показывает ли просмотр предварительно обработанного вывода, что BOOL — это макрос, который разрешается во что-то, что вызывает проблему? (gcc и MSVC используют параметр -E для вывода предварительно обработанного вывода).   -  person Michael Burr    schedule 05.07.2016
comment
Вы уверены, что создали typedef или просто сказали enum BOOL {...};?   -  person Paul Stelian    schedule 05.07.2016
comment
@jwodder позвольте мне посмотреть, что я могу сделать, этот код предназначен для моей работы, поэтому мне нужно очистить то, что я могу опубликовать.   -  person R. Johnson    schedule 05.07.2016
comment
@PaulStelian Я не уверен, typedef определен непосредственно в коде компилятора, предоставленном Microchip, и если я попытаюсь переопределить typedef, компилятор уведомит меня, что он уже определен.   -  person R. Johnson    schedule 05.07.2016
comment
Затем вы должны использовать обычные логические значения вместо BOOL, если они доступны.   -  person Paul Stelian    schedule 05.07.2016
comment
(можете ли вы?) Эти логические значения, вероятно, в любом случае будут вести себя лучше. Встроенный тип bool со значениями true и false   -  person Paul Stelian    schedule 05.07.2016
comment
@PaulStelian Я только что попробовал то, что вы предложили, используя встроенный тип bool, и компилятор все равно выдает ту же ошибку.   -  person R. Johnson    schedule 05.07.2016
comment
Тогда это немного странно. Я хотел бы увидеть полный код, в том числе, где может быть включен тип bool.   -  person Paul Stelian    schedule 05.07.2016
comment
@PaulStelian, как я прокомментировал jwodder немного ранее, мне нужно очистить то, что я публикую, поэтому я постараюсь обновить свой вопрос как можно быстрее, я ценю терпение.   -  person R. Johnson    schedule 05.07.2016
comment
@R.Johnson Дайте мне знать, когда он будет обновлен (я не получаю уведомлений об изменении на этом сайте)   -  person Paul Stelian    schedule 05.07.2016
comment
Чтобы получить поддержку bool стандарта C99 (если ваш компилятор поддерживает ее), вам может потребоваться #include <stdbool.h>. Кроме того, убедитесь, что в вашей кодовой базе нет #define BOOL _BOOL.   -  person Michael Burr    schedule 05.07.2016
comment
Логический тип встроенного C99 записывается как _Bool. Это часть языка. Стандартная библиотека предоставляет stdbool.h, который определяет bool, true и false как макросы, расширяющиеся до _Bool, 1 и 0 соответственно.   -  person John Bollinger    schedule 05.07.2016
comment
Сообщение об ошибке, которое вы получаете, указывает на то, что компилятор не распознает символы, предшествующие имени вашей функции, как обозначающие тип данных. Мы не можем быть уверены в каком-либо более конкретном диагнозе без полного примера, с помощью которого мы (или, по крайней мере, вы) можем его воспроизвести. Это не обязательно должен быть ваш собственный код; ему просто нужно воспроизвести ошибку.   -  person John Bollinger    schedule 05.07.2016
comment
это может вас заинтересовать: обратите внимание, что символы, начинающиеся с двойного подчеркивания или подчеркивания и заглавной буквы, безоговорочно зарезервированы для реализации. Да, системные заголовки используют имена с двойным подчеркиванием — они являются частью реализации и не могут загрязнять ваше пространство имен. Вы не должны загрязнять их пространство имен. Для всех практических целей, несмотря на множество контрпримеров, рассматривайте имена, начинающиеся с подчеркивания, как зарезервированные для компилятора.   -  person user3629249    schedule 06.07.2016
comment
НЕ typedef определения перечисления.   -  person user3629249    schedule 06.07.2016
comment
@user3629249 user3629249 скажи это Microchip, поскольку перечисление typedef является частью их кода компилятора, а не моим.   -  person R. Johnson    schedule 07.07.2016


Ответы (1)


Еще раз спасибо, что нашли время, чтобы помочь мне решить эту проблему. Я смог определить, что с более новой версией компилятора Microchip C32 v2.02 мне нужно объявить:

#include <plib.h>

которая является стандартной библиотекой Pic32 в файлах, использующих «новый» BOOL typedef. В более старой версии компилятора пользователь мог создать свой собственный typedeff BOOL (что я и сделал), но как только я удалил свой typedeff из кода, я не добавил подходящий заголовок для объявления перечисления.

Ошибка новичка с моей стороны, но я надеюсь, что этот ответ поможет другим людям, которые сталкиваются с подобной проблемой.

person R. Johnson    schedule 05.07.2016