2012-07-04 4 views
5

Сегодня у меня было интервью, там они спросили меня, можем ли мы включить .c file в исходный файл? Я сказал yes. Поскольку несколько лет назад я видел то же самое в каком-то проекте, где они включают .c file. Но сейчас я пытался сделать то же самое.Не можем ли мы включить файл .c?

abc.c

#include<stdio.h> 
void abc() 
{ printf("From ABC() \n"); } 


main.c

#include<stdio.h> 
#include "abc.c" 
int main() 
{ void abc(); 
    return 0; 
} 

Получение ошибки:

D:\Embedded\...\abc.c :- multiple definition of 'abc'

Где это происходит?

Я написал abc.h файл (тело abc.h является { extern void abc(void); }), и включен файл в abc.c (закомментировать #include abc.c). Отлично.

+0

(«Работал хорошо» * с включенными предупреждениями?) –

+3

Ну, есть несколько определений 'abc', так же, как компилятор говорит –

+0

Сделал это много времени, ленив писать make-файл или по крайней мере сценарий для компилятора многофайловых кодов (если вы не используете IDE). При включении файла '.c' просто визуализируйте, что все содержимое этого файла будет в этой позиции, и визуализируя, что вам нужно настроить повторные определения. – phoxis

ответ

14

Делайте это следующим образом:

abc.c:

#include <stdio.h> 
void abc() 
{printf("From ABC() \n");} 

main.c:

#include<stdio.h> 
#include "abc.c" 
int main() 
{ 
    abc(); 
    return 0; 
} 

(нет необходимости в заголовочном файле)

Затем, чтобы компилировать, вы» d только компилировать main.c. Не попытка скомпилировать какabc.c, так и main.c, потому что тогда у вас есть функция abc(), определенная дважды.

Вам необходимо понять, что #include в основном «копировать-вставить», не более того. Если вы сообщите об этом #include "abc.c", он просто возьмет содержимое abc.c и «вставляет» их в ваш файл main.c. Поэтому, используя выше main.c, после того, как препроцессор обрабатывает его, ваш main.c будет выглядеть следующим образом (я не обращая внимания на #include <stdio.h> с):

#include<stdio.h> 
#include <stdio.h> 
void abc() 
{printf("From ABC() \n");} 
int main() 
{ 
    abc(); 
    return 0; 
} 

, которая является действительной программой.

Это означает, что вы вообще не должны этого делать; вы должны скомпилировать все ваши файлы .c по отдельности и только затем связать их вместе.

+2

Прототип не является проблемой. Это не приведет к ошибке * multiple definition *. – ThiefMaster

+0

@houbysoft: Я сделал то же самое, но все же ошибка есть. Нет улучшения –

+0

I второй @ThiefMaster. Выполнение вышеуказанного должно по-прежнему приводить к ошибке, поскольку 'void abc()' определяется в двух единицах перевода: abc.c и main.c (через include). Линкер должен все еще жаловаться. – eran

5

Включение файлов C является абсолютно допустимым, если вы не пытаетесь скомпилировать включенный файл C сам по себе, а затем связать его вместе с объектным файлом из файла C, который включает в себя другой файл.

Если вы это сделаете, у вас будет тот же символ (обычно это функция), определенный в двух файлах, что приведет к ошибкам, которые вы опубликовали.

Если у вас есть несколько исходных файлов, вы обычно не включаете их, а компилируете их отдельно. Компонент затем объединяет объектные файлы в один исполняемый файл (или библиотеку).

4

Вы можете включить файл с любым расширением.

В вашей программе вы определили void abc(); в main(). вместо этого просто поставить оператор abc();

+0

Из исследования, которое я сделал, это самый ясный и самый простой ответ на вопрос. Голосовать! – ChinoCarloSedilla

2

Вы можете включить все, что вам нравится, препроцессор не заботится о расширениях файлов. Традиционно можно назвать заголовки «.h» и исходные файлы «.c» или «.cpp».

Вы должны быть уверены, что после компиляции всего проекта вы не столкнетесь с проблемами компоновщика (например, предоставление компилятору «abc.c» и «main.c» приведет к нескольким определениям вашего функция).

+0

Спасибо много .... –

Смежные вопросы