Компилятор может найти функцию без соответствия .h файл обновляется? - PullRequest
3 голосов
/ 13 марта 2010

Я пишу проект университета C и наткнулся на поведение компилятора, которое я не понимаю.

В этом файле http://code.google.com/p/openu-bsc-maximveksler/source/browse/trunk/20465/semester/tasks/maman14/alpha/maman14/assembler/phaseOne.c?r=112 Я добавил вызов функции с именем freeAsmInstruction (). Эта функция определена в файле с именем lineParser.c, но я не обновил соответствующий заголовочный файл lineParser.h, чтобы включить это объявление функции.

Почему этот код компилируется? Я ожидаю, что gcc не сможет скомпилировать phaseOne.c до тех пор, пока правильный файл lineParser.h не будет обновлен объявлением freeAsmInstruction ().

Буду признателен за объяснение.

Спасибо, Максим

Ответы [ 3 ]

3 голосов
/ 13 марта 2010

Компилятор GCC принимает определенную сигнатуру функции по умолчанию. Чтобы получить предупреждение об этом, скомпилируйте с флагом -Wall:

gcc -Wall -c phaseOne.c

это даст вам предупреждение формы:

phaseOne.c:2: warning: implicit declaration of function 'your func here'

Если у вас нет веских причин, вы должны всегда компилировать с флагом -Wall и, возможно, с другими флагами предупреждений.

1 голос
/ 13 марта 2010

Неопределенные функции не являются автоматически ошибкой; компилятор использует их для создания прототипа по умолчанию, а затем, когда ваш код окончательно скомпонован, если есть что-то с правильным именем, он будет использоваться. Однако, если прототип по умолчанию не соответствует вашей функции, ее аргументы будут установлены неправильно (подумайте, забивая квадратный колышек в круглое отверстие); последствия будут непредсказуемыми.

В большинстве случаев вы должны указывать компилятору рассматривать такие случаи как ошибку. Например, в gcc добавьте -Wall -Werror к каждой строке компиляции или добавьте их в CFLAGS в типичном файле Makefile.

0 голосов
/ 13 марта 2010

Я только что написал пример программы в двух отдельных файлах:

a1.c

#include <stdio.h>

int main() {
    // using the external object

    testing();

    return 0;
}

, которая вызывает функцию, которая существует в a2.c

void testing() {
    printf("temp\n");
}

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

$ gcc a1.c a2.c -o a1

и это Сработало

На самом деле, когда вы компилировали свой файл, вы включали другой файл C (lineParser.c) в шаг компиляции для анализа вместе с файлом ParseOne.c?

В таком случае, насколько я понимаю, gcc фактически проанализирует все символы в связанных файлах C (или obj-файлах) и заменит их соответствующим образом в конечном объектном файле, который будет создан.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...