2013-07-01 4 views
-1

Я очень новичок в C, поэтому приношу свои извинения за этот новый вопрос.Включая исходные файлы в файлы C

Я бы хотел использовать этот исходный код в своем проекте: http://base64.sourceforge.net/b64.c.

Итак, я включил его в мой тестовый файл:

#include <stdio.h> 
#include "b64.c" 

int main() 
{ 
    return 0; 
} 

Однако main() определяется в b64.c, так что при компиляции, я получаю:

test.c:4:5: error: redefinition of ‘main’ 
b64.c:495:5: note: previous definition of ‘main’ was here 
test.c: In function ‘main’: 
test.c:5:1: error: number of arguments doesn’t match prototype 
b64.c:495:5: error: prototype declaration 

Что такое правильное использование этого исходного файла или любого? Как мы его правильно используем или используем функции, определенные в этом файле?

Редактировать: Я понимаю, что проблема связана с повторяющимися определениями main. Я знаю, что может быть только один. Мой вопрос скорее, не будет ли в каждом значимом проекте его основным методом? Тогда почему существует основной метод, определенный в b64.c? Мы просто должны удалить этот метод из исходного кода? Кажется странным, что исходный код не просто готов к включению и использованию.

+0

Похоже, что ваш 'main' ничего не делает; зачем вам ваш тестовый файл? –

+1

Посмотрите здесь: http://stackoverflow.com/questions/232693/including-one-c-source-file-in-another – avignat

ответ

0

Если вы указали этот исходный файл, вы получаете неверное объявление 2 main(). Таким образом, в этом случае вы переопределили «главное».

Включая .c в другой .c файл не имеет смысла. C файлы компилируются в файлы .obj, которые связаны компоновщиком с исполняемым кодом, поэтому нет необходимости включать один файл .C в другой. Вместо этого вы можете создать файл .h, в котором перечислены функции, и включить этот файл .h в файл 0h.

+0

Я знаю, что это главное ничего не делает и что дублирующее определение вызывает ошибки. Однако, в любом конкретном проекте, не нужно ли нам определять наш собственный основной метод? И таким образом это вызовет ошибки, когда мы попытаемся включить этот исходный код? – user2517777

+0

В любом конкретном проекте вы не будете пытаться включить настоящую стороннюю программу, а только сторонние библиотеки. И что-то, предназначенное для работы в качестве библиотеки, не будет иметь свой собственный метод main(). (Он также не будет использоваться «# include» в исходный код источника проекта.) –

+0

Спасибо. Это стало причиной моей проблемы, интерпретировав данный исходный код как эквивалент небольшой библиотеки. – user2517777

0

вы должны использовать одну из двух основных функций. Если вы хотите новый основной, напишите свой основной метод в своем файле и удалите его из файла «b64.c», если вы хотите использовать его из файла «b64.c», удалите свой (пустой) файл.

0

Если main определено в b64.c, вы не можете просто переопределить его в своем основном исходном файле.

Что вы хотите, это использовать несколько функций из b64.c в вашей программе. Удалите из него функцию main и создайте файл заголовка, в котором вы протаиваете все функции в b64.c. После этого включите этот заголовочный файл в свою основную программу. Посмотрите на this short Wikipedia entry. Он должен дать вам обзор темы.

Кроме того: кажется, что вы не очень знаком с С. Попробуйте некоторые учебники и продолжать читать о С.

0

Прежде всего, вы должны переопределить файл .c как .h, и затем вам нужно пройти через исходный код и переименовать любые повторяющиеся методы или имена глобальных переменных. Основной метод - это отправная точка программы, поэтому ее может быть только один.

1

Это не хорошая идея для #include исходный файл C в ваш код. Вы можете либо скопировать код из другого исходного файла C в свой код, либо включить необходимые прототипы в свой код и сделать вызов функций, связав их после их компиляции отдельно.

+0

Что значит «связывать их»? Я понимаю, в том числе прототипы/вызывают их/компилируют в командной строке или в make, но не уверены в том, что вы подразумеваете, связав их. – user2517777

+0

Я не знаю вашей среды, поэтому я буду считать 'gcc' (Microsoft Visual Studio работает аналогичным образом). Если у вас есть два файла (назовите их 'foo.c' и' bar.c'), вы можете * скомпилировать их с помощью 'gcc -c foo.c' и' gcc -c bar.c'. Они генерируют объектные файлы 'foo.o' и' bar.o'. Затем вам нужно разрешить ссылки из одного файла на другой с помощью 'gcc -o prog foo.o bar.o', где' prog' является вашим окончательным исполняемым файлом. Скажем, у вас есть функция 'square', определенная в' bar.c' и вызываемая из 'foo.c'. Эти шаги разрешат ссылки, а последний шаг будет называться связыванием. – unxnut

0

(Обычно вы не включаете файлы .c, только .h) , если вам нужны функции внутри «b64.c», вы должны удалить основную функцию из «b54.c»!

0

Приложение C требует одной функции main(). Ваш файл b64.c выглядит как самодостаточная программа на C, поэтому вам не нужен ваш test.c. Просто скомпилируйте и запустите b64.c.

+0

Да, но тогда как я мог бы использовать функции b64.c в своих проектах? – user2517777

+0

Либо удалите основную функцию в b64.c и вызовите другие функции в модуле, либо используйте b64.c в качестве отправной точки и добавьте/замените свои функции в main(). – Bruce

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