Синтаксическая ошибка с другой версией gcc?

StackOverflow https://stackoverflow.com/questions/154902

  •  03-07-2019
  •  | 
  •  

Вопрос

Я написал программу на 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 вы используете?Знание этого позволит мне быть более конкретным в моем вопросе.

Спасибо

Это было полезно?

Решение

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

Другие советы

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

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

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

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

gcc -педантичный -Wall -Ошибка *.c
g++ -педантичный -Wall -Werror *.cpp

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

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

Кстати:Пожалуйста, исправьте использование тега code в вашем коде - в настоящее время его практически невозможно прочитать без использования "просмотреть исходный код" в моем браузере.

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

uname -a
gcc -v

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

-std=c89 -pedantic -Wall

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

-std=gnu89 -pedantic -Wall

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

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

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

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

С уважением Friedrich

Стив,

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

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

Что это за UNIX такой?ЭКС, Ультрикс, Миникс, Ксеникс?

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

gcc --version

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

gcc --version

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top