Синтаксическая ошибка с другой версией gcc? - PullRequest
1 голос
/ 01 октября 2008

Я написал программу на C с Ubuntu Linux, и теперь мне нужно перенести ее на компьютер с UNIX (или, как я считаю, с UNIX). Он прекрасно компилируется на моем Ubuntu с GCC, но когда я пытаюсь скомпилировать его с GCC на компьютере с UNIX, выдает такую ​​ошибку:

a.c: In function `goUpDir':
a.c:44: parse error before `char'
a.c:45: `newDir' undeclared (first use in this function)
a.c:45: (Each undeclared identifier is reported only once
a.c:45: for each function it appears in.)
a.c: In function `goIntoDir':
a.c:54: parse error before `char'
a.c:57: `newDir' undeclared (first use in this function)
a.c:57: `oldDir' undeclared (first use in this function)

Основными проблемами, по-видимому, являются ошибки синтаксического анализа до char (остальные относятся)

44  char newDir[50] = ""; 
54  char* oldDir = (char*)get_current_dir_name();

Это просто объявления строк в стиле C. Есть ли файл заголовка, который мне нужно включить, чтобы он работал в UNIX?

P.S. какая команда, чтобы увидеть, какую версию Unix и какую версию GCC вы используете? Знание этого позволит мне быть более конкретным в моем вопросе.

Спасибо

Ответы [ 9 ]

3 голосов
/ 01 октября 2008

Если вы компилируете чистый C, переменные должны быть объявлены в начале функций. Я упоминаю об этом, потому что большинство людей компилируют свои программы на C, используя компиляторы C ++, которые затем предлагают некоторые ресурсы, которые обычно недоступны для компиляторов чистого C, наиболее распространенным примером являются строки комментария //.

2 голосов
/ 01 октября 2008

Если вы хотите убедиться, что ваш код переносим, ​​всегда используйте -pedantic или -pedantic-errors.

Это обеспечит предупреждения / ошибки, когда ваш код отклоняется от соответствия стандартам.

Пока мы находимся на эту тему. Вы должны также включить все предупреждения. Есть веские причины, по которым компилятор предупреждает вас; при перемещении кода с одной платформы на другую эти предупреждения являются источником потенциальных ошибок, поскольку новое оборудование / ОС / компилятор может не работать так же, как ваша текущая.

Также используйте правильный исполняемый файл внешнего интерфейса GCC: g ++ будет обрабатывать файлы * .c как файлы C ++, если вы явно не укажете это. Так что если вы компилируете настоящий C, используйте gcc, а не g ++.

gcc -pedantic -Wall -Werror * .c
g ++ -pedantic -Wall -Werror * .cpp

Чтобы помочь с вашей конкретной проблемой, было бы неплохо увидеть строку 43. Хотя ошибка говорит о строке 44, много проблем вызвано тем, что в исходной строке возникла проблема, и проблема не была обнаружена анализатором, пока вы не доберетесь первая лексема на следующей строке.

1 голос
/ 02 октября 2008

Стив,

Первое сообщение об ошибке гласит: «parse error before 'char'». Каков код, который предшествует char? Это объявление функции? Включает ли он какие-либо пользовательские типы или что-то в этом роде?

Наиболее вероятным источником этой ошибки является то, что вскоре над строкой 44 используется тип или макрос, объявленный в файле заголовка ... этот файл заголовка может отличаться в вашей системе Ubuntu и той вы пытаетесь скомпилировать.

1 голос
/ 01 октября 2008

Информация недостаточна. Код выше, по крайней мере, так же интересен, и нужно знать, если говорить о ANSI C89 или ANSI C99. Первый ответ неверен в этом широком смысле.

С уважением Friedrich

1 голос
/ 01 октября 2008

Вы должны будете предоставить нам больше контекста для ошибок ... хотя бы одну, возможно, несколько строк перед строками 44 и 54. Скорее всего, если вы дадите нам код от начала определения функции до строки 44 (возможно, строка 40 или около того) до строки 54 (или несколькими строками позже - может быть, строка 60), тогда мы сможем помочь. Что-то не так с информацией до строки 44, что заставляет ее ожидать чего-то другого, кроме char 'в строке 44; то же самое (вероятно, та же проблема) в строке 54.

1 голос
/ 01 октября 2008

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

-std=c89 -pedantic -Wall

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

-std=gnu89 -pedantic -Wall

Но я предполагаю, что это может позволить расширения GNU на более новом GCC, которые не поддерживаются на более старом. Я не уверен.

Обратите внимание: хотя было бы неплохо, если бы -pedantic гарантированно предупреждал обо всех нестандартных программах, это не так. Есть еще некоторые вещи, которые он пропускает.

1 голос
/ 01 октября 2008

Как вы скопировали файл? Возможно ли, что вы вставили что-то, чего там быть не должно?

Кстати: пожалуйста, исправьте использование тега code в вашем коде - в настоящее время почти невозможно читать без использования «view source» в моем браузере.

Что касается вас, конечные вопросы:

uname -a
gcc -v
0 голосов
/ 01 октября 2008

Для отображения версии GCC:

gcc --version

Это может помочь показать функцию, чтобы мы могли видеть окружающий код. Это часто проблема с ошибками типа "parse error before".

0 голосов
/ 01 октября 2008

Что такое UNIX? AIX, Ultrix, Minix, Xenix?

GCC имеет флаг "--version":

gcc --version
...