473,386 Members | 1,796 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,386 software developers and data experts.

Header File Object Definition Trick


Let's say you want to write a simple header file, and don't want to be
burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You could simply
make the object static... but then you'll have a separate object for each
source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}

--

Frederick Gotham
Oct 7 '06 #1
8 1767

Frederick Gotham wrote:
Let's say you want to write a simple header file, and don't want to be
burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You could simply
make the object static... but then you'll have a separate object for each
source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}
I don't hope so ;-)

/Peter

Oct 7 '06 #2
peter koch wrote:
>Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}

I don't hope so ;-)
That's actually a common technique to make i a Singleton:

inline
SingleClass & getSingleton()
{
static SingleClass sc;
return sc;
}

The benefit is sc is well-defined to construct just before that function
enters. If sc were in the global data space, it would define at a random
time before main(), so any code that uses sc before main() would have
undefined behavior.

Now read "Singletonitis" in news:comp.object to avoid singleton abuse! And
don't put this crap in a header - write an implementation file for it. Some
small C++ applications can get by with header-only implementations, but
large scale C++ applications are bound by their compile times, so
implementation files are crucial.

--
Phlip
http://www.greencheese.us/ZeekLand <-- NOT a blog!!!
Oct 7 '06 #3
peter koch wrote:
Frederick Gotham wrote:
>Let's say you want to write a simple header file, and don't want to
be burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You
could simply make the object static... but then you'll have a
separate object for each source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}

I don't hope so ;-)
Why not? This is one of singleton implementations. Compare:

class MySingleton {
MySingleton(); // private c-tor, nobody else should construct
public:
static MySingleton& instance() {
static MySingleton s;
return s;
}
};

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 7 '06 #4

Victor Bazarov wrote:
peter koch wrote:
Frederick Gotham wrote:
Let's say you want to write a simple header file, and don't want to
be burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You
could simply make the object static... but then you'll have a
separate object for each source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}
I don't hope so ;-)

Why not? This is one of singleton implementations. Compare:

class MySingleton {
MySingleton(); // private c-tor, nobody else should construct
public:
static MySingleton& instance() {
static MySingleton s;
return s;
}
};
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness. And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.
So put shortly: don't do what Frederick suggests unless you have given
it good thought.

/Peter

Oct 8 '06 #5

Phlip wrote:
peter koch wrote:
Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}
I don't hope so ;-)

That's actually a common technique to make i a Singleton:

inline
SingleClass & getSingleton()
{
static SingleClass sc;
return sc;
}
Correct.
>
The benefit is sc is well-defined to construct just before that function
enters. If sc were in the global data space, it would define at a random
time before main(), so any code that uses sc before main() would have
undefined behavior.

Now read "Singletonitis" in news:comp.object to avoid singleton abuse! And
don't put this crap in a header - write an implementation file for it. Some
small C++ applications can get by with header-only implementations, but
large scale C++ applications are bound by their compile times, so
implementation files are crucial.
Right. And it is not just compilation time that is an issue.

/Peter

Oct 8 '06 #6
peter koch wrote:
>
Victor Bazarov wrote:
>peter koch wrote:
Frederick Gotham wrote:
Let's say you want to write a simple header file, and don't want to
be burdened with having to provide a source file as well with it.

There's a problem when the need arises for a global object. You
could simply make the object static... but then you'll have a
separate object for each source file that includes the header.

Do many people use a inline function to get around this?

inline
int &GetGlobal()
{
static int i;
return i;
}

I don't hope so ;-)

Why not? This is one of singleton implementations. Compare:

class MySingleton {
MySingleton(); // private c-tor, nobody else should construct
public:
static MySingleton& instance() {
static MySingleton s;
return s;
}
};
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness.
That maybe the way he put up the problem. However if your interface is
templated, your maybe forced to put your implementation into the header
(e.g., when your compiler does not support "export").

And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.
I can see the problems with multithreading for the first call that needs to
create the variable. However, my eyes fail me for the subsequent calls.
Could you elaborate on this one -- it sounds interesting.

So put shortly: don't do what Frederick suggests unless you have given
it good thought.
Well, name some idiom in C++ for which that does not hold :-)
Best

Kai-Uwe Bux
Oct 8 '06 #7
peter koch posted:
Surely - I know that idiom. But Fredericks question was not about
singletons, but rather one of laziness.

Using a header just involves a simple #include.

Using a source file involves adding it to your "compile files" and so on...

--

Frederick Gotham
Oct 8 '06 #8

Kai-Uwe Bux skrev:
peter koch wrote:
[snip]
And when a singleton is
appropriate, you better write something more elaborate than what
Frederick wrote or you'll get in trouble. If for nothing else, theres
the problem about using the function in multithreaded code. This
suddenly is unsafe even if youre only reading.

I can see the problems with multithreading for the first call that needs to
create the variable. However, my eyes fail me for the subsequent calls.
Could you elaborate on this one -- it sounds interesting.
Well, I do not really have more to add. The only thing to be afraid of
is the first call. (That is two threads calling the same function for
the first time at about the same moment). But even if it sounds like an
unrealistic, it is not. My experience tells me that those problem will
occur if you do not take appropriate guards.
In this case I prefer a plain global variable - or a "real" function
that serialises the access in case there is some dependency you can not
get rid of (as you surely know, the order of construction within one
file is well-defined).
So put shortly: don't do what Frederick suggests unless you have given
it good thought.

Well, name some idiom in C++ for which that does not hold :-)
Surely. And this probably holds for any language.

/Peter

Oct 12 '06 #9

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

Similar topics

31
by: Steven T. Hatton | last post by:
If a header is not necessarily a source file, and the sequences delimited by < and > in header names aren't necessarily valid source file names, what exactly is a header? -- p->m == (*p).m == p.m...
16
by: matthurne | last post by:
I just started learning C++ on my own...I'm using Accelerated C++. Something it hasn't explained and I keep wondering about is how header files actually work. I suspect it doesn't get into it...
11
by: ambika | last post by:
Iam just trying to know "c". And I have a small doubt about these header files. The header files just contain the declaration part...Where is the definition for these declarations written??And how...
1
by: C. Jayachandran | last post by:
I've inherited some code which has const std::string values defined in a header file, like const std::string str = "foo"; This causes a large amount of bloat, as all the compilation units...
2
by: Egbert Nierop | last post by:
Hi, Is it possible to redirect the linker & compiler to use a similar function without getting complaints about 'function x already in blah.obj'? Of course, I'm not talking about a runtime...
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...
10
by: Stephen Howe | last post by:
Hi Just going over some grey areas in my knowledge in C++: 1) If I have const int SomeConst = 1; in a header file, it is global, and it is included in multiple translations units, but it...
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...
7
by: bcpkh | last post by:
Hello All Received a header file from a supplier that defines an interface to implement but it's giving me a problem, I reproduce the general structure of the header file below; #ifndef XYZ_H...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
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...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

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.