or listening
Main Topics
Browse All TopicsWhat is the right way to divide my source code into different files according to their functionallity?
Right now I put all the structure definitions and function prototypes into a fileA.h, then I put the code for those functions into fileA.c. Then I include fileA.h from fileA.c and from the file that contains main (prog.c). For compiling I do:
gcc prog.c fileA.c -o prog.exe
The problem is when I have fileB.c that uses the functions and definitions from fileA.c. Then I need to include fileA.h from fileB.c.
gcc prog.c fileA.c fileB.c -o prog.exe
But if I add a third fileC.c that needs the functions from fileA and fileB things get really out of hand. It just does not seem correct. It seems like I'm including things too many times.
This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.
Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.
If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.
Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.
Access the answers to your technology questions today.
30-day free trial. Register in 60 seconds.
Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Try it out and discover for yourself.
30-day free trial. Register in 60 seconds.
Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.
well typically you put in your .h any public interfaces for your code - struct definitions, global variable type information, function prototypes - anything that does not generate code, or data objects
guard your .h's from multiple inclusions with
#ifndef XXXX_FILE_H
#define XXXX_FILE_H
...stuff
#endif
anything that makes an data object, or generates code goes in your .c
A common way of handling this situation is to have multiple header files. One header file has the common declarations, then the other header files reference the common declarations using extern.
Example:
file_main.h
int variable1;
int variable2;
fileA.h
extern int variable1;
extern int variable2;
fileB.h
extern int variable1;
extern int variable2;
int fileB_variable;
This way you include file_main.h only once in your program, then each of your c files can have its own header file without the duplicate symbol problem.
David
What ever you do, don't do what dceads is suggesting -
it's a maintenance nightmare to have the same variable
'extern'ed in more than one place AND it's very bad
to declare a variable in a .h file.
Here are some suggestions:
For subroutines that are implemented in file_a.c, and
are globally accessible, stick the prototype in
file_a.h.
For #defines (and enums) and structure definitions that
are used predominantly in
file_a.c, and their values are needed by other modules,
e.g. to interpret a return value, or to specify parameter
values, then place the #defines in file_a.h.
For globally visible variables, declare them in file_a.c,
AND put an extern in file_a.h, e.g.
file_a.c
int global_var;
file_a.h
extern int global_var;
and ensure that file_a.c #includes file_a.h.
For any functionality, e.g. #defines, variables,
subroutines that is NOT needed external to the module,
keep that functionality in the .c module that needs is, and don't
advertise it in any .h files.
And as mentioned earlier, it's a good idea to put
#include guards in your .h files, e.g.
file_c.h
#if !defined( _FILE_C_H_ )
#define _FILE_C_H
/* All your .h file stuff */
#endif
This ensures that if the .h file is included by the
same .c module more than once, the guts of the .h file
will only be looked at once while the compiler is
compiling that particular .c module.
And don't worry about the number of times a particular
.h file is included by different .c modules. I often
have a .h file that includes simple typedefs, e.g.
typedef unsigned char UINT8; and then I #include that
.h file in ALL my .c files.
Hope this helps.
anovickis is right,
use ifndef... define
or make sure if you include fileA in fileB and then fileB in main, do not include fileA in main, same if you have fileC that includes fileB, and fileB includes fileA, do not include fileA in fileC if you included fileB, and do not include fileA or fileB in main, if fileC is included
in your include file do this
#ifndef XXXX_FILE_H
#define XXXX_FILE_H
/* put everything in your include file you want here */
#endif
the XXXX_FILE_H is a unique name .. i use the file name of the include file or something like it
this is specifically to keep you out of class of problems where you have a dependancy tree in include files that somehow "mysteriously" includes the same file more than once
wquiot, you ask:
How does the preprocessor work? Dots are converted to underscore?
so if I want to include fileA.h it should be:
ifndef FILEA_H
#define FILEA_H
FILEA_H is simply a label, with no real meaning, other than it is a defined label. You just as easily can write:
ifndef I_HAVE_INCLUDED_FILEA_H
#define I_HAVE_INCLUDED_FILEA_H
/* all your stuff here */
#endif
in addition to what has already been said..
some times u can use extern safely!! .. like if u have multiple source files and u made lots header files .. but there is one function that is defined in b.c and u wanna use it in a.c ,and some how u cudnt manage it in ur header files, then extern-declare it in a.c..
btw using extern isnt that unsafe .. unless u know very well where r u using which function/variable ..
extern feature is there because many times its useful...had it been UNSAFE .. it would have disappeared
if u think .c files as class source .. then corresponding .h is ALMOST similar to the class prototypes public stuff.. and u dont need to have a .h corresponding to each .c
also make sure in case u want to produce library from your code and u think that function will not be of any use to the user of the library or u dont want him to see that function..
Theres absolutely nothing wrong with extern. The only pitfall to it is if you remove the variable, the compiler will say "Hey where'd that go?" even if you aren't using it anymore. Of course on some compilers, extern is meaningless, on others, its very strict.
It only means "a global variable not declared in this module" so to speak. The variable only gets declared once otherwise the compiler spits out an error similiar to "Multiple definition of varable xxxx in module xyz.o".. so the previous comments don't make much sense.
On to your question:
--------------------
Keep things separated. It lowers the amount of source code maintenance later on. You can cover this in 3 passes.
foo.c, foo.h, foo_protos.h
Put your code in foo.c
Put your structures and defines in foo.h
Put your function prototypes in foo_protos.h
if fileA.c only requires a structure definition, include foo.h in that. If it needs to call the functions, include both foo.h and foo_protos.h.
For simplicity, I include all related function prototypes and structures in one header.
--------------------------
/* foo.h */
#ifndef _FOO_H
#define _FOO_H
struct foobar
{
int foo;
int bar;
};
int DoFoo(struct foobar *foo);
#endif _FOO_H /* !_FOO_H */
--------------------------
/* foo.c */
#include "foo.h"
int DoFoo(struct foobar *foo)
{
foo->foo = 1;
foo->bar = 2;
}
--------------------------
Follow this model and you should be fine, the real trick to separating your code into source files is to make each function completely independent of another function (each function only does its own thing).
IE. The function DoFoo() can be used in any instance and does not depend on any other code modules.
It may seem as though you are using #include alot, chances are you are repeating the same includes throughout several files. You may want to simply weed out the most common ones and include them in one header.
/* prog.h */
#include "fileA.h"
#include "fileB.h"
#include "fileC.h"
/* fileC.c */
#include "prog.h"
--------------------------
Best of luck :)
Business Accounts
Answer for Membership
by: InternPosted on 2003-02-11 at 10:46:10ID: 7927692
monitoring