Linkage of locally declared functions
9.11 [dcl.link]
Mike Ball

Created on 1998-03-19.00:00:00 last changed 162 months ago


Date: 2002-10-15.00:00:00

[Moved to DR at October 2002 meeting. This was incorrectly marked as having DR status between 4/01 and 4/02. It was overlooked when issue 4 was moved to DR at the 4/01 meeting; this one should have been moved as well, because it's resolved by the changes there.]

Date: 2001-04-15.00:00:00

Proposed Resolution (04/01):

See the proposed resolution for Core issue 4, which covers this case.

The ODR should also be checked to see whether it addresses name and type linkage.

Date: 2020-12-15.00:00:00

Consider the following:

    extern "C" void foo()
        extern void bar();
Does "bar()" have "C" language linkage?

The ARM is explicit and says

A linkage-specification for a function also applies to functions and objects declared within it.
The DIS says
In a linkage-specification, the specified language linkage applies to the function types of all function declarators, function names, and variable names introduced by the declaration(s).
Is the body of a function definition part of the declaration?

From Mike Miller:

Yes: from Clause 9 [dcl.dcl] paragraph 1,

and 9.5 [dcl.fct.def] paragraph 1:
      decl-specifier-seqopt declarator ctor-initializeropt function-body
At least that's how I'd read it.

From Dag Brück:

Consider the following where extern "C" has been moved to a separate declaration:

    extern "C" void foo();

    void foo() { extern void bar(); bar(); }
I think the ARM wording could possibly be interpreted such that bar() has "C" linkage in my example, but not the DIS wording.

As a side note, I have always wanted to think that placing extern "C" on a function definition or a separate declaration would produce identical programs.

Date User Action Args
2008-10-05 00:00:00adminsetstatus: wp -> cd1
2003-04-25 00:00:00adminsetstatus: dr -> wp
2002-11-08 00:00:00adminsetmessages: + msg772
2002-11-08 00:00:00adminsetstatus: ready -> dr
2002-05-10 00:00:00adminsetstatus: dr -> ready
2001-05-20 00:00:00adminsetmessages: + msg517
2001-05-20 00:00:00adminsetstatus: drafting -> dr
1998-03-19 00:00:00admincreate