By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,696 Members | 1,522 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,696 IT Pros & Developers. It's quick & easy.

use a const variable as opposed to #define - Multiple const objects created

P: n/a
Recently, I try to replace #define with const in header file. However,
there are concerns on, multiple const object will be created, if the
header file is included in multiple cpp files.

For example:

In version.h
------------
#ifndef VERSION
#define VERSION

#include <string>

const std::string version("alpha_0-22");

#endif
In main.cpp
------------
#include <cstdio>
#include "version.h"

extern void fun();

int main()
{
printf("address of version in main=%p\n", &version);
fun();
getchar();
}

In fun.cpp
------------
#include <cstdio>
#include "version.h"

void fun()
{
printf("address of version in fun=%p\n", &version);
}

The output of the program will be:

address of version in main=00431960
address of version in fun=00431984

It seems that two copies of version string had been created if
version.h is included in different cpp file scope. Now I am worry if
version.h file is included in thousand of cpp files, will thousand of
version string object be created?!

My alternative workaround on this is, I will let version.h declare the
version string and version.cpp define the version string.

In version.h
------------
#ifndef VERSION
#define VERSION

#include <string>

extern const std::string version;

#endif

In version.cpp
--------------
#include "version.h"

const std::string version("alpha_0-22");

Again, here is my output:

address of version in main=00431960
address of version in fun=00431960

It seems that the const string just be constructed one time only.

I am not sure whether this is the correct workaround? Or my concern on
multiple creation of const object is not an issues?

Please refer to
http://www.parashift.com/c++-faq-lit....html#faq-29.7 on why I am
using const instead of const.

Thank you for your feedback.

yccheok

May 5 '06 #1
Share this Question
Share on Google+
4 Replies


P: n/a
ya************@gmail.com wrote:
Recently, I try to replace #define with const in header file. However,
there are concerns on, multiple const object will be created, if the
header file is included in multiple cpp files.

Make them extern const.

--
Ian Collins.
May 5 '06 #2

P: n/a

ya************@gmail.com wrote:

I am not sure whether this is the correct workaround? Or my concern on
multiple creation of const object is not an issues?


I am not an expert, but if I remember correctly a C++ compiler is
actually allowed to optimize away the const objects, provided you don't
do anything fancy to them and/or take their address. Maybe someone can
clarify on this?

May 5 '06 #3

P: n/a
in*************@gmail.com wrote:
ya************@gmail.com wrote:
I am not sure whether this is the correct workaround? Or my concern on
multiple creation of const object is not an issues?

I am not an expert, but if I remember correctly a C++ compiler is
actually allowed to optimize away the const objects, provided you don't
do anything fancy to them and/or take their address. Maybe someone can
clarify on this?

It most likely will, but perhaps not with a complex object like a string.

The issue is constants declared in headers have local scope to the
compilation unit, while those declared 'extern' have global scope and
must have only one definition.

--
Ian Collins.
May 5 '06 #4

P: n/a
* Ian Collins:
in*************@gmail.com wrote:
ya************@gmail.com wrote:
I am not sure whether this is the correct workaround? Or my concern on
multiple creation of const object is not an issues?


I am not an expert, but if I remember correctly a C++ compiler is
actually allowed to optimize away the const objects, provided you don't
do anything fancy to them and/or take their address. Maybe someone can
clarify on this?

It most likely will, but perhaps not with a complex object like a string.

The issue is constants declared in headers have local scope to the
compilation unit, while those declared 'extern' have global scope and
must have only one definition.


I think that's a good enough explanation for the OP.

However, for the record I think it should be noted that (1) the C++
language has no notion of header versus implementation file, so the
placement of a constant here or there does not affect its linkage, and
(2) it's possible to declare and define 'extern' constants in header
files without practical problems, but due to historical reasons (the
order things were introduced in in the language) one must do that via
the template mechanism, not just declaring the constants 'inline'.

--
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?
May 5 '06 #5

This discussion thread is closed

Replies have been disabled for this discussion.