Cygwin gcc скомпилировал ошибку в IDE с жалобой на необъявленное завершение работы - PullRequest
3 голосов
/ 07 февраля 2010

Когда я компилирую программу, используя

gcc code.c

Нет сообщений, и выходной файл создан успешно. Выходной файл работает. Однако, когда я пытаюсь использовать компилятор gcc той же установки cygwin в IDE (я пробовал Netbeans и Dev-C ++), я получаю следующие ошибки

main.cpp:27: error: `exit' undeclared (first use this function)
main.cpp:27: error: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp:77: error: `write' undeclared (first use this function)
main.cpp:78: error: `close' undeclared (first use this function)

Я не вижу, что отличается. Почему он не компилируется?

ОК, проблема была в том, что в IDE файл имел расширение .cpp, тогда как когда я компилировал из терминала, он имел расширение .c. Итак, мой новый вопрос: почему он не компилируется, когда рассматривается как файл c ++? Разве C не является подмножеством C ++?

Ответы [ 4 ]

6 голосов
/ 08 февраля 2010

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

Чтобы решить проблему, вы хотите добавить:

#include <stdlib.h>

Также при компиляции в командной строке. Обязательно используйте флаг -Wall, чтобы получать важные предупреждения:

gcc -Wall code.c
1 голос
/ 08 февраля 2010

В среде IDE используются более сложные опции для компилятора. Вам нужно включить несколько заголовков:

#include <stdlib.h>  // exit()
#include <unistd.h>  // close(), write()

Параметры по умолчанию позволяют компилировать практически все, что может быть Си. Похоже, IDE устанавливает «-Wmissing-prototypes» в качестве одного из параметров компилятора.


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

Существует подмножество C, которое также является подмножеством C ++; есть биты C, которые не являются C ++, и есть много битов C ++, которые не являются C. В частности, произвольная программа на C, как правило, не является программой на C ++. Например, программа на C может не объявлять 'exit ()', и все же она может использовать ее и все же компилировать. Программа на C ++ должна объявить 'exit ()', прежде чем она сможет использовать ее и скомпилировать.

0 голосов
/ 07 февраля 2010

Одной из возможных причин может быть то, что IDE не может получить доступ к включаемым файлам, компилятор gg cygwin может ожидать его в /usr/include (не уверен), и dev-cpp может не иметь доступа к ним.

0 голосов
/ 07 февраля 2010

Вам придется использовать g++ для компиляции .cpp файлов.

...