Недавно я ковырялся и пытался понять, как работают 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
?