Notice that in both cases (C and C++), the header file does not contain any function definitions (i.e. bodies) -- a programmer using the module shouldn't need to know how a function accomplishes its task; she just needs to know what the function's task is and how to use it.
More importantly, you must guard against the header file being #include-d more than once into a program that's being compiled. Most compilers don't mind seeing several declarations of the same function (as long as they agree with each other!), but will complain if a type is typedef-ed more than once (even if the definitions are identical). We can exploit the pre-processor to manage this for us: the first two lines of your header file should be
#ifndef FILENAME_H
#define FILENAME_H
(where FILENAME is replaced by the actual name of the file; e.g. mystuff.h should start with #ifndef MYSTUFF_H -- (e.g. that strfuncs functions need the Set class). the specific format of this name isn't important, but it should be closely related to the filename) and the last line should be
#endif
This isn't the place for a treatise on the pre-processor, but essentially these lines say "if you've never seen this file before, include these definitions; otherwise pretend you didn't see it."
Then, define all the functions you need. At the very least, this means all the functions declared in the header; you can also declare "helper" functions that exist only to help implement the functions declared in the header (and therefore don't need to be "exposed" to the public). If these helper functions are members of a (C++) class, then they of course are declared in the header, but otherwise they needn't be. To enforce the restriction that these functions are only to be used to implement your functions, you can/should declare each helper function as static, which means that it can only be invoked by functions defined in the same file.
Note that typedefs, etc., already declared in the header do not need to be redeclared here (because you're #include-ing the header directly).
One of the nicest things about modular construction is that one you have the module written correctly, you need only compile it once, then just link it with whichever programs need it. Of course, a module can't be compiled into an executable program, because it lacks a main() (and no module should ever contain a main()!), but it can be compiled into machine code nonetheless; this sort of file is often called an object file (no close relationship to C++ objects). So to compile our strfuncs module this way, we would write
acc -c strfuncs.c
or
CC -c strfuncs.c
(depending on whether we were using any C++ in the implementation of strfuncs). The result will be a file called strfuncs.o.
To use strfuncs in a program, first #include "strfuncs.h" at the top, as usual. This provides the compiler with the necessary definitions and function declarations (but notice that the function definitions are not "brought in" here -- that's the next step).
To compile the program (say it's called example.c), we have to list all the files the compiler/linker will need: example.c, of course, and also the object file (e.g. that strfuncs functions need the Set class). containing the function implementations for strfuncs (that is, strfuncs.o):
acc example.c strfuncs.o
This will produce a perfectly usable a.out; to produce a differently-named executable, use the -o option as usual.