неловкая проблема с #include в C - PullRequest
2 голосов
/ 06 сентября 2011

Не могли бы вы решить мою проблему? глядя на код, это говорит само за себя:

хиджра:

#include"c.h"
void a()
{
    printf("I am in a\n");
}

c.h:

#include<stdio.h>
void a();
void b();

main.c:

#include"c.h"

main()
{
    a();

}

и gcc main.c дадут мне:

/tmp/ccuaiUEA.o: In function `main':
main.c:(.text+0x7): undefined reference to `a'
collect2: ld returned 1 exit status

Не могли бы вы помочь мне, чтобы расширения файлов (.h и .c) оставались без изменений?

Ответы [ 5 ]

9 голосов
/ 06 сентября 2011

Вам нужно переименовать a.h в c.c, а затем собрать и запустить так:

$ gcc -Wall main.c c.c -o main
$ ./main

Объяснение: ваш a.h является исходным файлом , а не заголовком , поэтому для него должен быть суффикс .c, а не .h. Соответствующий заголовок - c.h, поэтому по соглашению он должен называться c.c. Когда вы создаете свой исполняемый файл, вам нужно скомпилировать и связать исходные файлы main.c и c.c, поэтому они оба включены в командную строку gcc.

4 голосов
/ 06 сентября 2011

Включая a.h из main.c "исправит" вашу проблему, но это просто не рекомендуется.

Вы должны поместить свой код в файлы .c, а не в заголовки.

2 голосов
/ 06 сентября 2011

Как правило, никогда не определяйте что-либо в файлах .h. Не помещайте туда определения переменных или функций. Это делает код грязным и трудным для чтения, и вы также получаете бесчисленные проблемы компоновщика на большинстве компиляторов.

a.h должен быть файлом c.c, включающим в себя c.h.

2 голосов
/ 06 сентября 2011

Ничто не включает a.h.Вам нужно добавить #include "a.h" после #include "c.h" в main.c.

Кстати, почему вы помещаете определение функции в заголовочный файл?

1 голос
/ 06 сентября 2011

Включить a.h в main.c

То, как пишется содержимое «ах», то есть тело функции, никогда не компилируется и не связано с вашей основной программой.Но, как правило, прототипы функции должны быть в заголовке, а определение функции должно быть в файле C.

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