473,382 Members | 1,341 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

work related dig regarding separation of definitions and implementations

Hi.

I've got a fella working for me who is trying to convince me to change our
coding standards to using separate .h and .cc files for definitions and
implementations. I know this is a perfectly valid way of doing things but
in my mind it is kind of quirky. Here's why.

The first reason I'd resist deals with the simplicity of makefiles. When
including most code from headers where classes are protected by #ifdef
blocks the makefile doesn't have to have a separate build rule for each
class.

Next, TTBOMK you need to do your classes in header files if you are going
to make them into generic templates...well, putting them into headers
isn't strictly a requirement but the other restrictions for (templatizable
code) would encourage only using headers.

I understand that there a a couple of reasons why you might want separate
definitions and implementation, such as when a class has a static data
member, or if you intend to create a shared object library of class code,
but it seems to me that putting the code into the header files is a bit
more elegant and the other way would be more of a holdover from the old
days before templates.

I'm wondering what comments the upper echelon lurkers might have. Do they
agree with my reasoning, or can they give me reasons why I should
reevaluate my assertions.
Jan 23 '07 #1
4 1430
noone wrote:
I've got a fella working for me who is trying to convince me to
change our coding standards to using separate .h and .cc files for
definitions and implementations. I know this is a perfectly valid
way of doing things but in my mind it is kind of quirky. Here's why.

The first reason I'd resist deals with the simplicity of makefiles.
When including most code from headers where classes are protected by
#ifdef blocks the makefile doesn't have to have a separate build rule
for each class.

Next, TTBOMK you need to do your classes in header files if you are
going to make them into generic templates...well, putting them into
headers isn't strictly a requirement but the other restrictions for
(templatizable code) would encourage only using headers.

I understand that there a a couple of reasons why you might want
separate definitions and implementation, such as when a class has a
static data member, or if you intend to create a shared object
library of class code, but it seems to me that putting the code into
the header files is a bit more elegant and the other way would be
more of a holdover from the old days before templates.

I'm wondering what comments the upper echelon lurkers might have. Do
they agree with my reasoning, or can they give me reasons why I should
reevaluate my assertions.
I know of no "upper echelon lurkers", so forgive my barging in, but
I have only one issue to mention: speed of compilation. As soon as
you cross a hundred file barrier (and have a team of more that three
people), you'll probably want to separate your implementation in
a different translation unit for each class so that it could be
independently compiled and not cause recompilation of all other
translation units that include it.

C++ was designed with large scale systems in mind. That's not the
only paradigm it supports, but it's the most important, if you ask me.
If your system is small, no big deal. Keep your headers full of code
and don't bother. We used to do that in Pascal, didn't we? Then
along came units, and suddenly we could split the development into
several relatively independent pieces... You can do it nowadays in
C++ with many modern compilers that support precompiled headers, of
course. But then again, once code changes you need to recompile
most of them again... Kind of PITA.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jan 23 '07 #2
* noone:
>
I've got a fella working for me who is trying to convince me to change our
coding standards to using separate .h and .cc files for definitions and
implementations. I know this is a perfectly valid way of doing things but
in my mind it is kind of quirky. Here's why.
Rather, having all code in header files is the unusual way.

The first reason I'd resist deals with the simplicity of makefiles. When
including most code from headers where classes are protected by #ifdef
blocks the makefile doesn't have to have a separate build rule for each
class.
Builds nowadays are mostly automated. Anyway, even with hand-crafted
make files you can lay down some general rules.

Next, TTBOMK you need to do your classes in header files if you are going
to make them into generic templates...well, putting them into headers
isn't strictly a requirement but the other restrictions for (templatizable
code) would encourage only using headers.
Even template code can benefit from a separation into header and
implementation. For most template classes that means including the
implementation file in the header file. The main advantage is that the
header file can give a very concise overview and defines the logical
interface, whereas with just one big file it's not that clear what's
interface and what's implementation detail. A possible but very
improbable advantage is that with compiler support for 'export' (only
Comeau right now, as far as I know) this can also reduce build times.

I understand that there a a couple of reasons why you might want separate
definitions and implementation, such as when a class has a static data
member
Can be done in header file via template trick.

>, or if you intend to create a shared object library of class code,
AFAICS that is irrelevant except for the headers the client code needs.

but it seems to me that putting the code into the header files is a bit
more elegant and the other way would be more of a holdover from the old
days before templates.

I'm wondering what comments the upper echelon lurkers might have. Do they
agree with my reasoning, or can they give me reasons why I should
reevaluate my assertions.
One reason to separate the two is that with all the code in headers, any
build of the system involves all of the code, which is slow (precompiled
headers have their own problems). And with all code in header files,
you force a remake of dependent modules when only the implementation is
changed, compounding that problem. A third reason to separate is to be
free to use any implementation techniques that suit the problem, instead
of doing very "clever" things and going amok with namespacing.

--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Jan 23 '07 #3
On Mon, 22 Jan 2007 23:09:57 -0500, Victor Bazarov wrote:
C++ was designed with large scale systems in mind. That's not the only
paradigm it supports, but it's the most important, if you ask me. If your
system is small, no big deal. Keep your headers full of code and don't
bother. We used to do that in Pascal, didn't we? Then along came units,
and suddenly we could split the development into several relatively
independent pieces... You can do it nowadays in C++ with many modern
compilers that support precompiled headers, of course. But then again,
once code changes you need to recompile most of them again... Kind of
PITA.
Thanks for your comments. I do understand your point. Our systems
definitely fall into the category of many small embedded programs with a
well defined message passing API to communicate between the processes.

Thanks for the followup.

Jan 23 '07 #4
On Tue, 23 Jan 2007 05:29:55 +0100, Alf P. Steinbach wrote:

Hi.

I should probably clarify what I mean by "all the code"

I'm talking about utility classes. The individual program logic is of
course still in .cc files. I try to encourage class coding where the
methods are suitable for implicit inline compilation.

And as I mentioned to Victor, the projects are numerous small embedded
software component programs of less than 1000 lines including comments.

The utility classes are things like C++ wrappers around socket networking,
a joystick driver (which does use a separate .cc file only because it uses
signals and requires a static data member to point to the class instance
that is needed to register in the polling timer), message passing
wrappers. interfaces to kernel drivers, etc.

Your points are well taken. I think based on scale it is a tradeoff right
now. The whole unmanned system operating environment compiles in less
than two minutes on a single CPU Xeon machine.
Jan 23 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

19
by: CMAR | last post by:
I have the following markup. The problem is that the browser, e.g., IE6, inserts several lines of blank space between the <div> and the following table. Is there a way to minimize that vertical...
6
by: johnnieboy | last post by:
I am trying to compile the program hull http://cm.bell-labs.com/netlib/voronoi/hull.html This is quite a complicated program that involves several .c files I get several warnings during...
5
by: sparks | last post by:
I am about to pull my hair out on this one. its a class stack with push and pop but one time its trying to find a } at the end of the code the next it says that I need a } after private man I...
8
by: yossi.kreinin | last post by:
Hi! When are multiple definitions of global variables with the same name considered legal in C, and how is it different from C++? It appears that in terms of assembly language, some C...
14
by: ToddLMorgan | last post by:
Summary: How should multiple (related) projects be arranged (structured) and configured so that the following is possible: o Sharing common code (one of the projects would be a "common" project...
36
by: zouyongbin | last post by:
Stanley B Lippman in his "C++ Primer" that a definition like this should not appear in a header file: int ix; The inclusion of any of these definitions in two or more files of the same...
3
by: sam_cit | last post by:
Hi Everyone, We all know that bit fields are to be used within a structure, like struct sample { int i:4; } However, is there any reason as to why it can only be specified only
10
by: subramanian100in | last post by:
Suppose I declare a global variable int g; in two different files say a.c which has main() and b.c When I compile them to build an executable under gcc in Redhat Linux with the command ...
11
by: whirlwindkevin | last post by:
I saw a program source code in which a variable is defined in a header file and that header file is included in 2 different C files.When i compile and link the files no error is being thrown.How is...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.