Какова взаимосвязь между стандартами C и С++?

Я писал этот ответ, и я процитировал http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters

Не представляется без знака char и не равен EOF, поведение undefined

Когда я пошел проверять редактирование, которое добавило эту фразу, я обнаружил, что комментарий автора:

Нельзя использовать символы с отрицательной подписью с любой функцией ctype.h на C99 7.4/1

Автор ссылается на стандарт C99 в документации на С++. Это верно? Я не мог найти ничего об определении этой функции в стандарте С++, поэтому я должен предположить, что она действительна.

Но это касается меня по двум причинам:

  • Как я узнаю, от какой версии стандарта C зависит стандарт С++?
  • Существуют списки расхождений между C и С++ везде. Если я смотрю на стандарт C со ссылкой на С++, как я могу узнать, была ли область, на которую я смотрю, была переопределена?

Ответ 1

Для первого вопроса:

В стандарте С++ явно перечислены стандарты C, от которых он зависит, в разделе "Нормативные ссылки". Для С++ 14, [intro.refs] 1.2/1 происходит список C 99:

  • ISO/IEC 9899: 1999, Языки программирования; С
  • ISO/IEC 9899: 1999/Cor.1: 2001 (E), Языки программирования; C, Техническое исправление 1
  • ISO/IEC 9899: 1999/Cor.2: 2004 (E), Языки программирования; C, Техническое исправление 2
  • ISO/IEC 9899: 1999/Cor.3: 2007 (E), Языки программирования; C, Техническое исправление 3

Во второй вопрос:

Стандарт С++ не подразумевает каких-либо частей стандарта C; все ссылки на стандарт C ясны. Хорошим источником информации о том, где С++ отличается от C, является Приложение C "Совместимость" стандарта С++, в частности C.1 [diff.iso].

Кроме того, ссылки на стандартную библиотеку C разбросаны по всему описанию стандартной библиотеки С++ (главы 17 – 30 в С++ 14). Особый интерес может быть:

  • 17.2 [library.c], который описывает базовое включение стандартной библиотеки C
  • Глава 18 [language.support], которая описывает многие заголовки <c:::> стандартной библиотеки С++ (те, которые предлагают функциональные возможности библиотеки C).

Ответ 2

Как я узнаю, от какой версии стандарта C зависит стандарт С++?

В С++ 14 это ISO/IEC 9899: 1999 (плюс три исправления, поэтому C99 по существу), как указано в 1.2 [intro.refs] в N4140. В С++ 98 это был C90, в С++ 17 он, вероятно, будет C11, но стандарт С++ всегда будет делать это явным.

Если я смотрю на стандарт C со ссылкой на С++, как я могу узнать, была ли область, над которой я смотрю, была переопределена?

Вы смотрите в стандарте С++, он либо явно импортирует определения C минус restrict, либо любое поведение C, которое он хочет, или вносит явные изменения.

Обычно чтение хорошей документации, а не самого стандарта, будет вам очень хорошо.


Чтобы решить свой первоначальный вопрос:

Автор ссылается на стандарт C99 в документации на С++. Это действительно?

Да, потому что

1 Таблицы 74 [содержит std::tolower, me], 75, 76, 77, 78 и 79 описывают заголовки <cctype>, <cwctype>, <cstring>, <cwchar>, <cstdlib>(преобразования символов) и <cuchar>, соответственно.
2 Содержимое этих заголовков должно совпадать с заголовками библиотеки стандартного C <ctype.h>, <wctype.h>, <string.h>, <wchar.h> и <stdlib.h>, а также заголовок TRC-кода C Unicode <uchar.h>, соответственно, с следующие изменения [ни одно из них не относится к std::tolower, me]:

21.8 [c.strings] в N4140

Ответ 3

Правильное редактирование, и этот текст был стандартным с C90.

Из C90 4.3

Заголовок объявляет несколько функций, полезных для тестирования и отображения символов. Во всех случаях аргументом является int, значение которого должно быть представлено в качестве неподписанного char или должно равным значению макроса EOF. Если аргумент имеет какой-либо другой значение, поведение undefined.

Из C11 7.4/1

Заголовок объявляет несколько функций, полезных для классификации и отображения символов. Во всех случаях аргументом является int, значение которого должно быть представлено в качестве неподписанного char или должно равным значению макроса EOF. Если аргумент имеет любое другое значение, поведение undefined.

Идентичный текст; C всегда было так. Поэтому не имеет значения, какая версия C используется для вашей конкретной версии С++, потому что все версии C эквивалентны.