CWG Issue 279 (original) (raw)

This is an unofficial snapshot of the ISO/IEC JTC1 SC22 WG21 Core Issues List revision 118e. See http://www.open-std.org/jtc1/sc22/wg21/ for the official list.

2025-11-05


279. Correspondence of "names for linkage purposes"

Section: 6.7 [basic.link]Status: CD6Submitter: Daveed VandevoordeDate: 4 Apr 2001

[Accepted at the November, 2020 meeting as part of paper P1787R6 and moved to DR at the February, 2021 meeting.]

The standard says that an unnamed class or enum definition can be given a "name for linkage purposes" through a typedef. E.g.,

typedef enum {} E;
extern E *p;

can appear in multiple translation units.

How about the following combination?

// Translation unit 1:
struct S;
extern S *q;

// Translation unit 2:
typedef struct {} S;
extern S *q;

Is this valid C++?

Also, if the answer is "yes", consider the following slight variant:

// Translation unit 1:
struct S {};  // <<-- class has definition
extern S *q;

// Translation unit 2:
typedef struct {} S;
extern S *q;

Is this a violation of the ODR because two definitions of type S consist of differing token sequences?