Какова взаимосвязь между стандартами 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 эквивалентны.