[diff.basic] # Annex C (informative) Compatibility [[diff]](./#diff) ## C.7 C++ and C [[diff.iso]](diff.iso#diff.basic) ### C.7.3 [[basic]](basic "6 Basics"): basics [diff.basic] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2851) **Affected subclause:** [[basic.def]](basic.def) **Change:** C++ does not have “tentative definitions” as in C. [*Example [1](#example-1)*: At file scope,int i;int i; is valid in C, invalid in C++[.](#1.sentence-1) — *end example*] This makes it impossible to define mutually referential file-local objects with static storage duration, if initializers are restricted to the syntactic forms of C[.](#1.sentence-2) [*Example [2](#example-2)*: struct X { int i; struct X* next; }; static struct X a;static struct X b = { 0, &a };static struct X a = { 1, &b }; — *end example*] **Rationale:** This avoids having different initialization rules for fundamental types and user-defined types[.](#1.sentence-3) **Effect on original feature:** Deletion of semantically well-defined feature[.](#1.sentence-4) **Difficulty of converting:** Semantic transformation[.](#1.sentence-5) In C++, the initializer for one of a set of mutually-referential file-local objects with static storage duration must invoke a function call to achieve the initialization[.](#1.sentence-6) **How widely used:** Seldom[.](#1.sentence-7) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2888) **Affected subclause:** [[basic.scope]](basic.scope) **Change:** A struct is a scope in C++, not in C. [*Example [3](#example-3)*: struct X {struct Y { int a; } b;};struct Y c; is valid in C but not in C++, which would require X​::​Y c;[.](#2.sentence-1) — *end example*] **Rationale:** Class scope is crucial to C++, and a struct is a class[.](#2.sentence-3) **Effect on original feature:** Change to semantics of well-defined feature[.](#2.sentence-4) **Difficulty of converting:** Semantic transformation[.](#2.sentence-5) **How widely used:** C programs use struct extremely frequently, but the change is only noticeable when struct, enumeration, or enumerator names are referred to outside the struct[.](#2.sentence-6) The latter is probably rare[.](#2.sentence-7) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2912) **Affected subclause:** [[basic.link]](basic.link) [also [[dcl.type]](dcl.type "9.2.9 Type specifiers")] **Change:** A name of file scope that is explicitly declared const, and not explicitly declared extern, has internal linkage, while in C it would have external linkage[.](#3.sentence-2) **Rationale:** Because const objects may be used as values during translation in C++, this feature urges programmers to provide an explicit initializer for each const object[.](#3.sentence-3) This feature allows the user to put const objects in source files that are included in more than one translation unit[.](#3.sentence-4) **Effect on original feature:** Change to semantics of well-defined feature[.](#3.sentence-5) **Difficulty of converting:** Semantic transformation[.](#3.sentence-6) **How widely used:** Seldom[.](#3.sentence-7) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2929) **Affected subclause:** [[basic.start.main]](basic.start.main) **Change:** The main function cannot be called recursively and cannot have its address taken[.](#4.sentence-1) **Rationale:** The main function may require special actions[.](#4.sentence-2) **Effect on original feature:** Deletion of semantically well-defined feature[.](#4.sentence-3) **Difficulty of converting:** Trivial: create an intermediary function such asmymain(argc, argv)[.](#4.sentence-4) **How widely used:** Seldom[.](#4.sentence-5) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L2942) **Affected subclause:** [[basic.types]](basic.types) **Change:** C allows “compatible types” in several places, C++ does not[.](#5.sentence-1) For example, otherwise-identical struct types with different tag names are “compatible” in C but are distinctly different types in C++[.](#5.sentence-2) **Rationale:** Stricter type checking is essential for C++[.](#5.sentence-3) **Effect on original feature:** Deletion of semantically well-defined feature[.](#5.sentence-4) **Difficulty of converting:** Semantic transformation[.](#5.sentence-5) The “typesafe linkage” mechanism will find many, but not all, of such problems[.](#5.sentence-6) Those problems not found by typesafe linkage will continue to function properly, according to the “layout compatibility rules” of this document[.](#5.sentence-7) **How widely used:** Common[.](#5.sentence-8)