Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!tut.cis.ohio-state.edu!ucbvax!agate!bionet!ames!amdcad!sun!pitstop!sundc!seismo!uunet!mcvax!hp4nl!botter!star.cs.vu.nl!maart From: maart@cs.vu.nl (Maarten Litmaath) Newsgroups: comp.lang.c Subject: Re: TLINK errors (cc/lint were clean) Message-ID: <2002@solo12.cs.vu.nl> Date: 3 Feb 89 03:37:03 GMT References: <44100021@hcx1> Organization: V.U. Informatica, Amsterdam, the Netherlands Lines: 49 ldh@hcx1.SSD.HARRIS.COM writes: \header.h: \#include \#include < > (a bunch of includes) \int a,b,c,d,e,f,g,h; \float i,j,k,l,m,n,o,p; \char q,r,s,t,u,v; Aaaaaaaaargh! A header file should NEVER contain variable DEFINITIONS! It should only contain `#define's and variable DECLARATIONS. So: extern int a, ...; extern float i, ...; extern char q, ...; The definitions are handled in an accompanying file `header.c'. A nice solution to prevent redundancy (and error-proneness): #ifndef HEADER_H #define HEADER_H #ifndef EXTERN #define EXTERN extern #else EXTERN #define INIT #endif !EXTERN EXTERN int a, ...; EXTERN float i, ...; EXTERN char q[] #ifdef INIT = "hey babe!" #endif INIT ; #endif !HEADER_H In `foo.c': #include "header.h" In `header.c': #define EXTERN #include "header.h" -- "Does she play, er, tennis? |Maarten Litmaath @ VU Amsterdam: Wink wink, notch notch!" |maart@cs.vu.nl, mcvax!botter!maart