2015-07-25 3 views
0

Например, я хочу увидеть код функции toupper(), чтобы понять, как это работает, есть ли способ? Я искал и открыл string.h библиотеку, но ничего не нашел.Как просмотреть стандартные библиотечные функции в C++?

+0

'string.h' - это заголовок, а не библиотека. – melpomene

+0

@melpomene, Cool, как посмотреть, что внутри toupper()? – user3002386

+1

Зависит от того, какую библиотеку вы используете. Это не похоже на то, что для всех компиляторов C++ используется одна реализация. – melpomene

ответ

1

Да, конечно, вы могли бы (не все реализации, может быть). Например, реализация 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; 
} 
+0

Большое спасибо :) – user3002386

+1

@ user3002386 Какая польза от вас есть эта информация? Это ужасный код C, а не переносимый. – Walter

+1

В каком смысле это не переносимо? '_NL_CURRENT' отсутствует здесь, а также' LC_TYPE' и '_NL_CTYPE_TOUPPER', поэтому реализация является неполной. Но что зависит от компилятора или операционной системы? Почему он должен быть портативным? Символы с нечеткими и прописными буквами лидера в любом случае являются собственностью компилятора? – harper

3

От строгой точки зрения языка, вы не можете «увидеть код» стандартной функции, так как стандартный язык 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++ прекрасно документированы и имеют, с некоторыми спорными исключениями, хорошо продуманные интерфейсы. Это может быть интересно, и обучение, и иногда даже необходимы для отладки, чтобы посмотреть в их реализации на вашей системе, но не позволяйте этому возможность держать вас от обучения два важных программно-технические навыки:

  1. Чтение документации ,
  2. Программирование на интерфейсы, а не на реализацию.
+0

не '' (а не '')? – Walter

+0

@Walter: Для целей этого вопроса это не имеет значения, потому что оба ошибочны. '' является официально устаревшим синонимом '', содержащим все функции 'char'-pointer от C. –

+0

@Christian Hackl, Спасибо, ваш ответ очень помог мне. – user3002386

Смежные вопросы