G CC: Несогласованные предупреждения "неопределенная функция"? - PullRequest
0 голосов
/ 09 июля 2020

Недавно я ковырялся и пытался понять, как работают C компиляторы.

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

// a.c

// #include"oui.h"
int main() {
  oui();
}
// oui.h

void oui();

gcc -c a.c

На одном компьютере меня предупреждают, что функция oui в a.c не определена. Для меня это имеет смысл, и раскомментирование включения устраняет проблему.

Однако на другом компьютере, даже с закомментированным включением, компилятор создает объект a.o без жалоб. Для меня это не имеет смысл, потому что oui не определено без файла заголовка?

Какое нормальное поведение? Не сбились ли какие-то настройки на одном из моих компьютеров?

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

Дополнительный вопрос: флаг -c создает объектные файлы, но не связывает его, поэтому есть ли специальный флаг «ссылка» для объединения объектных файлов вместе, или это просто gcc? Почему бы просто не g cc все вместе в начале?

Дополнительный вопрос № 2: если я сделаю gcc filea fileb filec, будет ли filea по своей сути особенным как первый аргумент? Или порядок g cc не имеет значения, потому что компилятор сам находит файл с main?

1 Ответ

1 голос
/ 11 июля 2020

Возможно, разница версий между двумя компьютерами.

Какое поведение является нормальным? Компилятор должен предупредить, если вы используете функцию, которая не объявлена.

Неправильно ли какие-то настройки на одном из моих компьютеров? Я так не думаю, что у вас есть один новый g cc и более старый.

Дополнительный вопрос №1: если вы используете g cc без -c, он попытается вызвать компоновщик. В этом примере компоновщик завершится ошибкой, поскольку oui не определено. -c часто используется в Makefiles / для больших проектов, так как вы можете перекомпилировать быстрее, потому что компилятору не нужно заново компилировать каждый исходный файл.

Дополнительный вопрос № 2: Порядок исходных файлов не имеет значения, поскольку компоновщик сам находит main.

...