Например, я хочу увидеть код функции toupper()
, чтобы понять, как это работает, есть ли способ? Я искал и открыл string.h
библиотеку, но ничего не нашел.Как просмотреть стандартные библиотечные функции в C++?
ответ
Да, конечно, вы могли бы (не все реализации, может быть). Например, реализация Glibc definestoupper
функции как:
#define __ctype_toupper \
((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128)
int
toupper (int c)
{
return c >= -128 && c < 256 ? __ctype_toupper[c] : c;
}
Большое спасибо :) – user3002386
@ user3002386 Какая польза от вас есть эта информация? Это ужасный код C, а не переносимый. – Walter
В каком смысле это не переносимо? '_NL_CURRENT' отсутствует здесь, а также' LC_TYPE' и '_NL_CTYPE_TOUPPER', поэтому реализация является неполной. Но что зависит от компилятора или операционной системы? Почему он должен быть портативным? Символы с нечеткими и прописными буквами лидера в любом случае являются собственностью компилятора? – harper
От строгой точки зрения языка, вы не можете «увидеть код» стандартной функции, так как стандартный язык C++ определяет только прототип и поведение функций , а не как они реализованы.
Фактически, со строгой языковой точки зрения, стандартная функция, такая как toupper
, даже не должна иметь исходный код, поскольку стандартный заголовок, например <string.h>
, даже не должен быть файлом!
Конечно, в практике вы, вероятно, никогда не столкнетесь с реализацией C++, в которой стандартные заголовки не являются файлами, потому что файлы - это просто естественная и простая реализация заголовков. Это означает, что на практике для заголовка <string.h>
на самом деле есть исходный файл C++ с именем «string.h» на вашем компьютере. Просто найдите его и откройте.
Я искал и открыл
string.h
библиотеку, но ничего не нашел.
Тогда вы еще не выглядели достаточно близко. Совет. Этот файл, скорее всего, включает в себя один или несколько других файлов заголовков.
Обратите внимание, что если вы действительно искали toupper
, эта функция не находится в <string.h>
в любом случае. Вместо этого посмотрите на <ctype.h>
. cppreference.com - это хорошая онлайн-ссылка, на которой вы указываете, какие заголовки содержат какие функции.
http://en.cppreference.com/w/c/string/byte/toupper
Опять же, это не означает, что соответствующий файл заголовка вашего компилятора содержит эту функцию непосредственно, но прямо или косвенно может включать в себя какой-либо другой файл, который содержит его.
В любом случае, остерегайтесь того, что вы будете видеть внутри заголовочных файлов вашего компилятора. Это, как правило, намного сложнее, чем вы думаете, и, что более важно, он часто использует конструкции, которые вы не можете использовать в своем собственном коде; в конце концов, код в этих файлах является внутренним для реализации компилятора, и у компилятора есть много привилегий, которых у вас нет, например, с использованием других запрещенных идентификаторов, таких как _STD_BEGIN
. Также ожидайте много совершенно нестандартных #pragma
и других непереносимых материалов.
Еще одна важная вещь, о которой следует помнить, заключается в том, что вы не должны копаться в реализации функции, чтобы узнать, что она делает. В плохо написанном программном обеспечении, то есть программном обеспечении с запутанными интерфейсами и отсутствии документации (которая существует повсюду в реальном мире), вы, к сожалению, должны это сделать, если у вас есть доступ к исходному коду.
Но стандартные функции C++ прекрасно документированы и имеют, с некоторыми спорными исключениями, хорошо продуманные интерфейсы. Это может быть интересно, и обучение, и иногда даже необходимы для отладки, чтобы посмотреть в их реализации на вашей системе, но не позволяйте этому возможность держать вас от обучения два важных программно-технические навыки:
- Чтение документации ,
- Программирование на интерфейсы, а не на реализацию.
не '
@Walter: Для целей этого вопроса это не имеет значения, потому что оба ошибочны. '
@Christian Hackl, Спасибо, ваш ответ очень помог мне. – user3002386
- 1. OCaml отсутствует стандартные библиотечные функции
- 2. C++ применяет стандартные библиотечные алгоритмы к функциям
- 3. Гарантирование стандартные библиотечные контейнеры освобождаются
- 4. Почему многие встроенные/стандартные библиотечные функции Python фактически являются классами
- 5. GCC или сделать флаг запретить определенные стандартные библиотечные функции
- 6. Обнаружение, если включены стандартные библиотечные контейнеры
- 7. C/C++ - переопределяете стандартные функции
- 8. Как определить, какие стандартные библиотечные модули Python содержат определенный метод?
- 9. Стандартные и стандартные типы C++
- 10. Как найти библиотечные функции в ATS?
- 11. Как вызвать библиотечные функции std в lldb
- 12. Где в C описываются стандартные вариационные функции?
- 13. Передача unique_ptr в библиотечные функции (функция FORTRAN)
- 14. Не связывайте все стандартные библиотечные модули при компиляции OCaml
- 15. Какие стандартные библиотечные модули необходимы для запуска интерпретатора Python 3.5?
- 16. Библиотечные зависимости Проект C++
- 17. Являются ли библиотечные функции и операторы C/C++ наиболее оптимальными?
- 18. Как передать стандартные генераторы в функции STL?
- 19. Почему некоторые стандартные библиотечные функции Swift не распознаются на игровой площадке?
- 20. Как переопределить стандартные функции libc?
- 21. Стандартные функции схемы?
- 22. Выполняют ли все стандартные функции C++ в C++/CLI?
- 23. Использовать библиотечные функции WCF из браузера
- 24. 'fseek() + output' Behays Strange on C Стандартные библиотеки ввода-вывода Библиотечные потоки памяти
- 25. Разве дизассемблеры обнаруживают стандартные функции?
- 26. Стандартные делегаты в C#
- 27. Как линкер находит стандартные и WinAPI-функции?
- 28. Изменение функции OpenCV Стандартные параметры
- 29. PHP: как вызвать стандартные функции библиотеки
- 30. Как увидеть библиотечные функции, доступные в любой библиотеке Arduino?
'string.h' - это заголовок, а не библиотека. – melpomene
@melpomene, Cool, как посмотреть, что внутри toupper()? – user3002386
Зависит от того, какую библиотеку вы используете. Это не похоже на то, что для всех компиляторов C++ используется одна реализация. – melpomene