From: Leif Leonhardy Newsgroups: comp.os.msdos.djgpp Subject: Re: Split source file Date: Sat, 08 Sep 2001 09:56:33 +0200 Organization: delta t Computerservice Lines: 96 Message-ID: <3B99CF31.9709AC9F@dtcs.de> References: <3B99AC68 DOT 35DDFD8E AT hotmail DOT nospam DOT com> NNTP-Posting-Host: pd9e0e1c2.dip0.t-ipconnect.de Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Trace: news.online.de 999935717 26653 217.224.225.194 (8 Sep 2001 07:55:17 GMT) X-Complaints-To: abuse AT online DOT de NNTP-Posting-Date: 8 Sep 2001 07:55:17 GMT X-Mailer: Mozilla 4.01 [de] (Win95; I) X-Priority: 3 (Normal) To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Ian Rees schrieb: > > Hi, > I am sure this is a rather dumb question, but I can't figure it out. It is. And it is actually a question of C (comp.lang.c), not djgpp. > I am writing a program which uses allegro, and the source is getting > very long. It is inconvenient to look through all the lines of code to > find what I am looking for, and search is a pain. Your editor should search for you. > I would like to make > two separate files, like main.c and gui.c, and be able to just pull all > the gui functions out of my current main.c and put them in a file called > gui.c and then compile to one .exe file. I have tried doing this and > using the command: > > gcc -Wall -o prog.exe source.c gui.c -lalleg > > but no exe is created and it spits out many warnings like: > > gui.c:5: warning: implicit declaration of function '....' > and > gui.c:18: '...' undeclared (first use in this function) ^^^^^^^^^^^ this is generally an ERROR (not just a warning) > > all of the ...s above are either allegro functions or constants. ^^^^^^^^^ they HAVE TO be defined somewhere (this is an ERROR) The easiest, bad way is to split the source file "linear" in two parts and put an #include "part2.c" at the end of part1.c, but this does not allow separate compilation and is very bad style (only a work around if you cannot split your sources into modules, e.g. if you have large arrays of data, and your last-millenium? editor is limited to 64K of text.) Before you use a function, you have to declare it (implicit declarations of functions are allowed only if their return type is int, but this is bad style, too). Constants and types, structs etc. HAVE TO be declared before usage; that's why there are the so-called header files (*.h). So if you split your file into main.c and gui.c, you should write a file "gui.h", with function prototypes (DECLARATIONS) and possibly type and constant DEFINITIONS, which is included by BOTH main.c AND gui.c, removing the constant and type definitions from gui.c. Duplicate function DECLARATIONS (i.e., prototypes) do not matter (in case you leave some of them gui.c). gui.c, and possibly gui.h, have to #include "allegro.h" (or whatever). It also may be necessary to #include "allegro.h" in main.c, but if you split your application well, you won't need that. Other standard include files like stdio.h will typically have to be included by both files. The big advantage of modularization is not only readability (though it may be inconvenient to search/edit hundreds of files, but you normally don't do that), but also separate compilation. If you change little (one file), you usually don't have to re-compile all of the modules. gcc -c gui.c # produces gui.o gcc -c main.c # produces main.o gcc -o main main.o gui.o -lallegro # produces main.exe (linking) ... edit main.c # changes main.c gcc -c main.c # re-compile only main.c or gcc -o main main.c gui.o -lallegro ^^^^^ doesn't have to be recompiled In doing so, you should also consider using 'make', i.e., writing a Makefile: all: main.exe main.exe: main.o gui.o ../lib/liballegro.a main.o: main.c gui.h gui.o: gui.c gui.h ../include/allegro.h (Make 'knows' how to make object files from C files etc.) This is only an outline, read the documentation of make. The more files you have, the more is it worth. Leif