Странная ситуация связывания - PullRequest
1 голос
/ 21 июня 2011

Поговорив о связывании в ## C на irc.freenode.net, я пошел протестировать некоторые изученные мной концепции и придумал эту ситуацию.

У меня есть этот файл с именем main.c:

int main(void) {
    func();

    return 0;
}

И этот файл с именем test.c:

#include <stdio.h>

void func(void) {
    printf("Hello.\n");
}

Там нет файла test.h.

Я делаю это:

$ gcc -c main.c
$ gcc -c test.c
$ gcc main.o test.o
$ ./a.out
Hello.
$

и это работает.Разве gcc не должен жаловаться при первом вызове, что он не знает функцию func (), которая вызывается в файле main.c?Я не включил ни одного файла с его прототипом или реализацией, и все же gcc может скомпилировать объектный код и сделать вменяемый исполняемый файл.Что случилось там, что мне не хватает?

Спасибо.

Ответы [ 2 ]

8 голосов
/ 21 июня 2011

Включите несколько предупреждений, и вы будете до боли осведомлены о проблемах.

> gcc -Wall -c main.c
main.c: In function ‘main’:
main.c:2:5: warning: implicit declaration of function ‘func’

C по умолчанию будет предполагать неизвестные функции. Хорошо? Возможно нет. Историческая справка.

Также gcc -std=c99 также выдаст предупреждение.

2 голосов
/ 21 июня 2011

Это работает, потому что все типы аргументов совпадают (так как у вас нет никого). Вы можете сделать так, чтобы gcc жаловался, называя его gcc -c -Wall test.c

...