Linkage specifications nest
. When linkage specifications nest, the
innermost one determines the language linkage
. [
Note 4:
A linkage specification does not establish a scope
. —
end note]
In a
linkage-specification,
the specified language linkage applies
to the function types of all function declarators and
to all functions and variables whose names have external linkage
. [
Example 2:
extern "C"
void f1(void(*pf)(int);
extern "C" typedef void FUNC();
FUNC f2;
extern "C" FUNC f3;
void (*pf2)(FUNC*);
extern "C" {
static void f4();
}
extern "C" void f5() {
extern void f4();
}
extern void f4();
void f6() {
extern void f4();
}
—
end example]
A C language linkage is ignored
in determining the language linkage of
class members,
friend functions with a trailing
requires-clause, and the
function type of non-static class member functions
. [
Example 3:
extern "C" typedef void FUNC_c();
class C {
void mf1(FUNC_c*);
FUNC_c mf2;
static FUNC_c* q;
};
extern "C" {
class X {
void mf();
void mf2(void(*)();
};
}
—
end example]
If two declarations of an entity give it different language linkages, the
program is ill-formed; no diagnostic is required if neither declaration
is reachable from the other
. A redeclaration of an entity without a linkage specification
inherits the language linkage of the entity and (if applicable) its type
.Two declarations declare the same entity
if they (re)introduce the same name,
one declares a function or variable with C language linkage,
and the other declares such an entity or declares a variable
that belongs to the global scope
. [
Example 4:
int x;
namespace A {
extern "C" int f();
extern "C" int g() { return 1; }
extern "C" int h();
extern "C" int x();
}
namespace B {
extern "C" int f();
extern "C" int g() { return 1; }
}
int A::f() { return 98; }
extern "C" int h() { return 97; }
—
end example]
A declaration directly contained in a
linkage-specification
is treated as if it contains the
extern
specifier ([dcl.stc]) for the purpose of determining the linkage of the
declared name and whether it is a definition. [
Example 5:
extern "C" double f();
static double f();
extern "C" int i;
extern "C" {
int i;
}
extern "C" static void g();
—
end example]
[
Note 5:
Because the language linkage is part of a function type, when
indirecting through a pointer to C function, the function to
which the resulting lvalue refers is considered a C function
. —
end note]
Linkage from C++ to entities defined in other languages and to entities
defined in C++ from other languages is
implementation-defined and
language-dependent
. Only where the object layout strategies of two
language implementations are similar enough can such linkage be
achieved
.