Annex C (informative) Compatibility [diff]

C.1 C++ and ISO C [diff.iso]

C.1.2 Clause [basic]: basic concepts [diff.basic]

[basic.def]
Изменение: C ++ не имеет «предварительных определений», как в C.
Например, в области видимости файла,

int i;
int i;

допустимо в C, недопустимо в C ++. Это делает невозможным определение взаимно ссылочных локальных статических объектов файла, если инициализаторы ограничены синтаксическими формами C.Например,

struct X { int i; struct X* next; };

static struct X a;
static struct X b = { 0, &a };
static struct X a = { 1, &b };


Обоснование: это позволяет избежать использования разных правил инициализации для основных типов и типов, определяемых пользователем.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность преобразования: семантическое преобразование. В C ++ инициализатор для одного из набора взаимно-ссылочных локальных статических объектов должен вызывать вызов функции для выполнения инициализации.
Насколько широко используется: редко.

[basic.scope]
Изменение: A struct - это область видимости в C ++, а не C.
Обоснование: область видимости класса имеет решающее значение для C ++, а структура - это класс.
Влияние на исходную функцию: изменение семантики четко определенной функции.
Сложность преобразования: семантическое преобразование.
Насколько широко используются: программы на C используются struct чрезвычайно часто, но изменение заметно только тогда struct, когда имена перечисления или перечислителя упоминаются вне struct. Последнее, вероятно, встречается редко.

[basic.link] [также [dcl.type]]
Изменение: имя области видимости файла, которое явно объявлено const, а не объявлено явно extern, имеет внутреннюю связь, тогда как в C оно будет иметь внешнюю связь.
Обоснование: поскольку const объекты могут использоваться в качестве значений во время трансляции в C ++, эта функция побуждает программистов предоставлять явный инициализатор для каждого const объекта. Эта функция позволяет пользователю помещать const объекты в исходные файлы, которые включены более чем в одну единицу перевода.
Влияние на исходную функцию: изменение семантики четко определенной функции.
Сложность преобразования: семантическое преобразование.
Насколько широко используется: редко.

[basic.start.main]
Изменение: main функция не может вызываться рекурсивно и не может быть его адрес взят.
Обоснование: main функция может потребовать специальных действий.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность конвертации: Тривиально: создайте посредническую функцию, такую ​​как mymain(argc, argv).
Насколько широко используется: редко.

[basic.types]
Изменение: C допускает «совместимые типы» в нескольких местах, а C ++ - нет.
Например, идентичные struct типы с разными именами тегов «совместимы» в C, но являются совершенно разными типами в C ++.
Обоснование: для C ++ необходима более строгая проверка типов.
Влияние на исходный объект: удаление семантически четко определенного объекта.
Сложность преобразования: семантическое преобразование. Механизм «безопасного соединения» обнаружит множество, но не все, таких проблем. Те проблемы, которые не обнаруживаются с помощью безопасного связывания, будут продолжать функционировать должным образом в соответствии с «правилами совместимости компоновки» настоящего международного стандарта.
Насколько широко используется: Обычный.