sed in 'foo.h' as follows: #ifndef FOO_H #define FOO_H 1 /* The above macro definitions. */ #include "..." BEGIN_C_DECLS int foo PARAMS((void)); int hello PARAMS((void)); END_C_DECLS #endif /* !FOO_H */ Note that the '#ifndef FOO_H' prevents the body of 'foo.h' from being read more than once in a given compilation. Also the only thing that must go outside the 'BEGIN_C_DECLS'/'END_C_DECLS' pair are '#include' lines. Strictly speaking it is only C symbol names that need to be protected, but your header files will be more maintainable if you have a single pair of these macros around the majority of the header contents. You should use these definitions of 'PARAMS', 'BEGIN_C_DECLS', and 'END_C_DECLS' into your own headers. Then, you may use them to create header files that are valid for C++, ANSI, and non-ANSI compilers(1). Do not be naive about writing portable code. Following the tips given above will help you miss the most obvious problems, but there are definitely other subtle portability issues. You may need to cope with some of the following issues: * Pre-ANSI compilers do not always support the 'void *' generic pointer type, and so need to use 'char *' in its place. * The 'const', 'inline' and 'signed' keywords are not supported by some compilers, especially pre-ANSI compilers. * The 'long double' type is not supported by many compilers. ---------- Footnotes ---------- (1) We used to recommend '__P', '__BEGIN_DECLS' and '__END_DECLS'. This was bad advice since symbols (even preprocessor macro names) that begin with an underscore are reserved for the use of the compiler.