Re: Anonymous namespace and internal linkage
On Feb 7, 6:46 pm, Anand Hariharan <mailto.anand.hariha...@gmail.com>
wrote:
On Feb 6, 7:40 am, James Kanze <james.ka...@gmail.com> wrote:
On Feb 6, 9:33 am, Anand Hariharan <mailto.anand.hariha...@gmail.com>
wrote:
This code fails during linking:
namespace {
void FuncA()
{
/*extern*/ void FuncB(void);
FuncB();
}
void FuncB() {}
}
int main()
{
FuncA();
}
Is it to be expected?
Isn't 'extern' qualifier meaningless here?
It should be.
It turns out that the linker does not have a problem when the 'extern'
is
uncommented.
That sounds like an error.
Technically, of course, you have undefined behavior (both
ways). But the FuncB called in FuncA is a function in the
anonymous namespace; the FuncB you define isn't, so it isn't
the same function.
FuncB *is* defined in the anonymous namespace.
So I see. I misread your code, then made the mistake of
reentering it, instead of copy/pasting it.
Could you kindly clarify why it is UB?
If the definition of FuncB is outside of the unnamed namespace,
you haven't provided a definition for the FuncB in the unnamed
namespace. For the actual code, there is no UB---it's a fully
conformant and correct program.
(FWIW: both Sun CC and g++ give a link error in both cases,
with or without the extern. So does the version of VC++ that
I have here: the one from Visual Studios 8.)
So how does one call a function defined farther down in the
same file, in an anonymous namespace?
As you did. With or without the extern---as you correctly
assumed, the extern makes no difference here.
--
James Kanze (GABI Software) email:james.ka...@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]