Re: Will two symbols with the same name clash?
DeMarcus wrote:
Victor Bazarov wrote:
DeMarcus wrote:
Paul Bibbings wrote:
DeMarcus <use_my_alias_here@hotmail.com> writes:
If I define the variables like this
file1.cpp
static int varA;
file2.cpp
static int varA;
Am I allowed to send either varA pointer to other places in the
application?
Are you able to say a little more about what you are trying to achieve?
With the little information we have, it strikes me, at least, as a
little convoluted. Your question began with name clashing, then sought
a method to make your same-named variables TU-local, and now you are
asking how you can refer to these same-named variables outside of
the TU
they're defined in.
Questions to be asked include, in the first instance, "Why are your
variables named the same?" "What application-wide visibility do you
want
for these variables?" Then you might want to ask yourself to what
extent your answers to these questions conflict.
I want to achieve the following.
file_class.cpp
const MessageClass ERROR( "Could not find file" );
class FileClass
{
public:
FileClass()
{
GlobalRegister::register( &ERROR );
What does that do?
It registers the ERROR MessageClass to a global register that keeps
track of all messages to give them correct language.
I suppose it pre-loads the translations from some repository (like
Resources on Windows), am I close?
Actually the MessageClass looks more like this.
const MessageClass ERROR( "Could_not_find_file_id" );
where ERROR when used picks up correct language string.
OK, so the registration part of your system only cares about the *value*
of the string, not the actual address. Does it store a copy of it? Or
do you make your registration store the address of 'ERROR'? Not that
it's important, really... It should work either way.
My question was mostly to ensure that your 'register' does not try to
use the name of the variable ("ERROR") in any way. Of course, the use
of '&' is somewhat hinting that 'register' doesn't care about the
variable linked to the object whose address you're passing to it...
}
[...]
I want to allow any file be able to use the symbol ERROR but at the
same time they shall be able to register the pointer to that variable
Why? What for?
> without
clashing with other variables with the same symbol name.
What does registering have to do with compilation? Are you confusing
run-time behavior (of your system) with the behavior of the compiler
(who determines and reports "name clashes")?
I want to be able to use the same symbols (here symbol ERROR) in
different places.
OK. Judging from the code you posted so far, there should be no
problem. Of course, you (hopefully) already found that if you make the
object 'const' you don't have that problem because a const object has
internal linkage by default. If you don't declare your object 'const',
it has external linkage, and without 'static' (which forces internal
linkage) or placing it in an unnamed namespace (which changes the name
of the var so it becomes inaccessible from other TUs) you will get
problems with the linker.
> The symbols then may clash in link-time (unless I put
them in different namespaces as suggested), however, each and every
MessageClass are registered in a global register where the language can
be changed.
Since those instances of 'MessageClass' all have their own storage,
their addresses are unique, and the "global register" should be able to
distinguish between two objects like that. Beware of address problems
when accessing objects across DLL boundaries (although this is quite
OS-specific), like defining the object in one DLL and using its address
in another.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask