Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #93937

Re: To include or not to include

From BartC <bc@freeuk.com>
Newsgroups comp.lang.c
Subject Re: To include or not to include
Date 2016-09-23 12:17 +0100
Organization A noiseless patient Spider
Message-ID <ns3316$i3b$1@dont-email.me> (permalink)
References <ns2tkb$p0$1@dont-email.me> <ns310l$bj5$1@dont-email.me>

Show all headers | View raw


On 23/09/2016 11:43, David Brown wrote:
> On 23/09/16 11:45, James Harris wrote:
>> I often have at the top of a C source file, which I'll call F, an
>> include for its corresponding header:
>>
>>   #include "F.h"
>>
>> After that come the various includes I need for the .c code that follows.
>>
>> In many cases the .c and the .h include some of the same files. They
>> might both pull in stdio.h or string.h, for example.
>>
>> Of course, I could omit from F.c at least some of the headers which F.h
>> includes. But I tend to take the approach of including in the .c all
>> those the .c code needs.
>>
>> Assuming either approach is just as valid, which is the best style or is
>> one more idiomatic than the other?
>>
>>
>> As an aside, in F.c I include F.h so that the compiler can check that
>> function definitions (in F.c) match function declarations (in F.h). So,
>> if it's relevant, I guess I tend to use includes as a policy rather than
>> as a mechanism for managing other includes.
>>
>
> I prefer the following rules for includes:
>
> 1. F.c should include F.h, to make sure that function definitions in F.c
> and function declarations in F.h match.
>
> 2. I make sure that any functions or file-level variables in F.c are
> either defined "static" in F.c, or they are declared "extern" in F.h and
> have matching definitions in F.c.
>
> 3. Header F.h should include all the headers it needs in order to be
> complete.  If G.c includes F.h, it should not have to include anything
> else before or after it.  So if F.h declares a function that takes a
> uint32_t, then F.h must include stdint.h.

My rules would be a little different (using example module A):

* A.h should only contain declarations for A.c that will be exported to
   or shared with other modules

* A.h should not contain any includes that are not needed for A.h
   itself. Only includes that are necessary for A.h to compile as a
   standalone file. (For example, including a header that contains
   macros and typedefs used by A.h's declarations)

The rules might be bent a little when looking at a whole project:

* If a project P comprises modules A, B and C, then I might instead
   construct a composite header P.h containing A.h, B.h and C.h.

* Then each of A.c, B.c and C.c includes P.h

* Any external includes (outside of A, B and C) that are used by some or
   all of A, B and C, can also be placed in P.h. Then each module need
   only be headed by a single, common include file.

It can get more complicated if A and B, for example, need to include 
each other's headers; which one is included first in each module? It may 
be necessary to extract items from A.h and B.h that are put into a third 
header (eg. AB.h) that is included before either A.h or B.h (or placed 
before them in P.h).

C allows more elaborate interdependencies still, so it's not possible to 
have rigid rules, only guidelines.

-- 
Bartc

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-23 10:45 +0100
  Re: To include or not to include David Brown <david.brown@hesbynett.no> - 2016-09-23 12:43 +0200
    Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-23 12:17 +0100
      Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-23 13:32 +0100
        Re: To include or not to include David Brown <david.brown@hesbynett.no> - 2016-09-23 14:57 +0200
        Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-24 20:34 +0100
          Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-24 23:55 +0100
            Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 01:43 +0100
              Re: To include or not to include Ian Collins <ian-news@hotmail.com> - 2016-09-25 14:38 +1300
              Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-25 11:42 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 11:58 +0100
                Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-25 14:06 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 15:15 +0100
                Re: To include or not to include Reinhardt Behm <rbehm@hushmail.com> - 2016-09-25 23:33 +0800
                Re: To include or not to include Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2016-09-25 10:04 -0600
                Re: To include or not to include Reinhardt Behm <rbehm@hushmail.com> - 2016-09-26 00:21 +0800
                Re: To include or not to include "James R. Kuyper" <jameskuyper@verizon.net> - 2016-09-25 13:17 -0400
                Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-26 00:18 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-26 17:55 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-26 20:07 +0100
                Re: To include or not to include supercat@casperkitty.com - 2016-09-26 12:13 -0700
                Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-27 01:25 +0100
                Re: To include or not to include supercat@casperkitty.com - 2016-09-26 18:05 -0700
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-27 14:27 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-27 14:49 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-27 15:15 +0100
                Re: To include or not to include Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-27 07:42 -0700
                Re: To include or not to include Keith Thompson <kst-u@mib.org> - 2016-09-27 09:30 -0700
                Re: To include or not to include Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-27 10:06 -0700
                Re: To include or not to include supercat@casperkitty.com - 2016-09-27 08:12 -0700
                Re: To include or not to include Tim Rentsch <txr@alumni.caltech.edu> - 2016-09-28 10:46 -0700
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-27 17:55 +0100
                Re: To include or not to include supercat@casperkitty.com - 2016-09-27 10:19 -0700
                Re: To include or not to include Keith Thompson <kst-u@mib.org> - 2016-09-27 11:42 -0700
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-27 19:57 +0100
                Re: To include or not to include Keith Thompson <kst-u@mib.org> - 2016-09-27 12:38 -0700
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-27 21:00 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-28 01:50 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-28 10:55 +0100
                Re: To include or not to include Malcolm McLean <malcolm.mclean5@btinternet.com> - 2016-09-27 13:33 -0700
                Re: To include or not to include Ike Naar <ike@iceland.freeshell.org> - 2016-09-28 19:13 +0000
                Re: To include or not to include supercat@casperkitty.com - 2016-09-27 12:38 -0700
                Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-27 20:57 +0100
                Re: To include or not to include supercat@casperkitty.com - 2016-09-27 07:25 -0700
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-28 00:28 +0100
                Re: To include or not to include supercat@casperkitty.com - 2016-09-30 07:53 -0700
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-30 16:06 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-27 13:53 +0100
                Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-30 19:46 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-30 20:27 +0100
                Re: To include or not to include Reinhardt Behm <rbehm@hushmail.com> - 2016-09-25 23:27 +0800
                Re: To include or not to include Jerry Stuckle <jstucklex@attglobal.net> - 2016-09-25 11:38 -0400
                Re: To include or not to include Reinhardt Behm <rbehm@hushmail.com> - 2016-09-25 23:40 +0800
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 15:06 +0100
                Re: To include or not to include Jerry Stuckle <jstucklex@attglobal.net> - 2016-09-25 11:49 -0400
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 18:05 +0100
                Re: To include or not to include Jerry Stuckle <jstucklex@attglobal.net> - 2016-09-25 16:42 -0400
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 21:53 +0100
                Re: To include or not to include Jerry Stuckle <jstucklex@attglobal.net> - 2016-09-25 17:57 -0400
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-25 21:20 +0100
                Re: To include or not to include BartC <bc@freeuk.com> - 2016-09-25 21:49 +0100
                Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-26 00:40 +0100
      Re: To include or not to include David Brown <david.brown@hesbynett.no> - 2016-09-23 14:56 +0200
  Re: To include or not to include Richard Heathfield <rjh@cpax.org.uk> - 2016-09-23 13:31 +0100
    Re: To include or not to include James Harris <james.harris.1@gmail.com> - 2016-09-23 13:52 +0100
      Re: To include or not to include Richard Heathfield <rjh@cpax.org.uk> - 2016-09-23 14:35 +0100
    Re: To include or not to include Ben Bacarisse <ben.usenet@bsb.me.uk> - 2016-09-23 18:55 +0100
      Re: To include or not to include Richard Heathfield <rjh@cpax.org.uk> - 2016-09-23 20:33 +0100
  Re: To include or not to include Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2016-09-23 08:22 -0600
  Re: To include or not to include Richard Damon <Richard@Damon-Family.org> - 2016-09-23 11:37 -0400

csiph-web