Ошибка gcc c: ожидается ')' перед числовой константой

Привет, я пытался портировать LWIP на новое устройство руки. При компиляции кода получаю сообщение об ошибке:

"lwip/lwip-1.4.0/src/include/lwip/memp_std.h:35:23: error: expected ')' before numeric constant"

Когда я перехожу к этому файлу, я нахожу в этой строке несколько подобных макросов ниже:

LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        "RAW_PCB")

Если я устраню необходимость в этом макросе с определением деактивации функции RAW, ошибка перейдет к следующему макросу LWIP_MEMPOL().

Определение, перед которым он, кажется, хочет поставить ')', определяется следующим образом:

#define MEMP_NUM_RAW_PCB          1

RAW_PCB не определен, но «объединяется с MEMP_» для создания элемента в перечислении.

Я попытался выполнить все с опцией -E, чтобы получить файлы объектов, которые можно редактировать, и посмотреть, смогу ли я найти какие-либо открытые '(' вокруг областей, где появляется MEMP_RAW_PCB, и замену MEMP_NUM_RAW_PCB на 1, но я не нашел ни одного ручной осмотр еще.

Есть ли какие-либо предложения о том, что здесь может происходить или что еще я могу сделать или искать, чтобы найти причину ошибки?

Возможно, я должен добавить, что до сих пор я не вызывал какой-либо код LWIP из main() или какие-либо функции, используемые в main().


person ElvishPriestley    schedule 22.08.2013    source источник
comment
Я рекомендую взглянуть на препроцессор, сгенерированный из рассматриваемой строки.   -  person alk    schedule 22.08.2013
comment
Это было быстро, спасибо :). Да, именно это я и делаю, когда использую параметр -E для получения файлов .o. Думаю, надо еще повнимательнее посмотреть :). Любая идея, что я должен искать?   -  person ElvishPriestley    schedule 22.08.2013
comment
Препроцессор каким-то образом генерирует неверный код из макроса на memp_std.h:35. Проверьте этот код.   -  person alk    schedule 22.08.2013
comment
Можете ли вы показать определение LWIP_MEMPOOL?   -  person lurker    schedule 22.08.2013
comment
memp_std.h многократно #include для создания различных структур, которым нужны записи для каждого пула памяти. Конечно, было бы полезно знать, где вы находитесь в иерархии #include, когда появляется эта ошибка, чтобы вы могли определить, какой вызов #include "lwip/memp_std.h" вызывает проблему.   -  person rici    schedule 22.08.2013
comment
В показанном вами вызове LWIP_MEMPOOL отсутствует точка с запятой. Это настоящий код или опечатка в этом вопросе?   -  person jxh    schedule 22.08.2013
comment
LWIP определяет, отменяет и переопределяет LWIP_MEMPOL несколько раз. Я попытаюсь скопировать и вставить эти определения в текст.   -  person ElvishPriestley    schedule 22.08.2013
comment
Так написано в файле memp_std.h. Я подумал, что было немного странно, что не было ';' в файле, но поскольку это библиотечный код, я подумал, что те, кто когда-либо писал его, знали, что делали, или внесли бы исправления, если бы он был неправильным, и тогда я перестал об этом думать. Я проверил сейчас версию LWIP 4.1.1, и у нее был тот же файл memp_std.h. Но определенно странно. Мне нужно будет проверить это завтра, я сейчас не на ПК с проектом.   -  person ElvishPriestley    schedule 22.08.2013
comment
Скомпилировал сегодня с ';' но это только что заставило gcc жаловаться на отсутствие идентификатора перед ;. Я думаю, что поскольку макрос используется так, как он есть, у него не может быть окончания ;.   -  person ElvishPriestley    schedule 23.08.2013
comment
Наконец-то я смог его скомпилировать. Я не знаю точно, в чем была проблема. Но кто бы ни сделал порт, на котором основывался мой порт, он сделал один огромный (относительно) файл .h со всеми файлами .h, найденными в папке include lwip. Когда я удалил эти включения, я, наконец, смог получить ошибки, которые я мог легко решить. Однако, если я снова включу другие файлы, он остановится на той же строке. В любом случае спасибо за вашу помощь! (^_^)у   -  person ElvishPriestley    schedule 23.08.2013


Ответы (3)


Я решил это с помощью:

#ifndef MEMP_STD_H_ 
#define MEMP_STD_H_

... // memp_std.h codes ...

#endif //#ifndef MEMP_STD_H_
person wii    schedule 07.03.2014
comment
Ха-ха, охранники об этом вообще не подумали. Думаю, об этом следует сообщить как об ошибке сопровождающим LWIP. В настоящее время я не работаю с ним, но я верю вам, когда вы говорите, что это решает проблему. - person ElvishPriestley; 12.03.2014

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

Изучите код, предшествующий показанной строке (возможно, после использования gcc -E), чтобы убедиться, что все скобки сбалансированы.

person jxh    schedule 22.08.2013
comment
Код, который находится над ним в файле memp_std.h, состоит из определений и ifdefs (с концами), в этом файле нет открытых '('. Я пытался найти ошибку в предварительно скомпилированных файлах .o после компиляции с -Е вариант, но пока я его не нашел, попробую завтра. - person ElvishPriestley; 22.08.2013

Если вы определяете его с помощью параметра dash-D, он будет генерировать 1 по умолчанию, например:

gcc -D 'MAX(A,B) ((A) < (B)? (B) : (A))' ...

Генерирует:

#define MAX(A,B) ((A) < (B)? (B) : (A)) 1

И вы получаете сообщение error: expected ‘)’ before numeric constant в строке, где происходит замена из-за этой завершающей 1, например:

int maxval = MAX(i,j);
// generates: int maxval = ((i) < (j)? (j) : (i)) 1;

И наоборот, если вы используете оператор присваивания для явного определения значения, оно будет сгенерировано так, как вы ожидали. Например.:

int maxval = MAX(i,j);
// generates: int maxval = ((i) < (j)? (j) : (i));
person Luv2code    schedule 30.06.2017