Re: header interfaces in C !
Robby wrote:
All the programmer needs is the header file which shows all function
declarations and therefore knows that their respective implementation
functions is in the .c file. So all he has to do is call the f1() function in
order to use the object . However,
f1(), f2() and f3() are all show in the .h, but all the programmer needs to
see is
F1() function !!!!!
So what is usually done to hide the other 2 function declarations in the
header file f2() and f3() leaving only the F1() function visible which is
all we need to use the something object ?
Robby:
The usual way to do this is to provide your code as a static (.lib) or dynamic
(.dll) library. Then you release the header and the library file, but not the .c
source file. For a dynamic library you should also distribute .lib import file
so the client can easily link to the functions in the DLL.
A few points:
1. Always use #include guards on header files, in case the header gets included
more than once in the same translation unit.
2. Please don't use symbols like y for class or struct names. When I first
looked at your header I thought you were defining a variable called y (defining
variables in header files is a no-no).
3. If your implementation is in C, you should use extern "C", so that your
header can also be used transparently by a C++ client.
4. You should always #include your own header in the your own code so the
compiler can check that the prototype declaration you give your client matches
the actual function in the library.
5. As David Webber says, you only need to put things in the header file that the
client actually needs to know about. You also do not need prototype declarations
in your .c file for functions used only in that file (provided you give the
definitions in the right order).
//==============================something.h
#ifndef SOMETHING_H
#define SOMETHING_H
#ifdef __cplusplus
extern "C"{
#endif
typedef struct something
{
int x;
} SOMETHING;
void f1(); // declaration
#ifdef __cplusplus
}
#endif
#endif // #ifndef SOMETHING_H
//===========================something.c
#include "something.h"
void f3()
{
SOMETHING s; // defined in header
// code here....
}
void f2()
{
// code here....
f3(); // defined above
}
void f1() // matches declaration is header file
{
// code here....
f2(); // defined above
}
====================================
--
David Wilkinson
Visual C++ MVP