2009-07-14 4 views
16

Я хотел посмотреть на реализацию различных функций C/C++ (например, strcpy, stcmp, strstr). Это поможет мне узнать хорошие методы кодирования в c/C++. Не могли бы вы сообщить мне, где я могу его найти?Исходный код функций c/C++

Спасибо.

+0

Возможно ли получить исходный код стандартной библиотеки c? – 2009-07-14 19:00:04

+0

Каждый компилятор C будет использовать свой собственный исходный код для стандартной библиотеки C. Аналогично, каждый компилятор C++ будет использовать свой собственный исходный код для стандартных библиотек C и C++ (C++ включает C, поэтому компилятору нужны обе библиотеки). Однако также возможно, что strcpy() непосредственно реализуется компилятором; он может просто исправить правильный код вместо создания вызова функции. – MSalters

+0

Итак, чтобы получить конкретную реализацию библиотеки, нужно выяснить, доступны ли люди, написавшие интересный компилятор, исходный код? –

ответ

25

Вы можете проверить копию glibc, которая будет иметь исходный код для всех функций C в стандартной библиотеке C. Это должно быть хорошим стартовым местом.

+3

Хотя это первый ответ, который приходит на ум, это может быть не лучшее место, чтобы узнать о «хороших методах кодирования», которые имеют общую применимость. Это связано с тем, что функции glibc имеют обоснованную причину для того, чтобы быть сильно оптимизированными по микро-оптимизации - даже оптимизация для платформы - просто потому, что они являются стандартными библиотечными функциями. Обычно это не хорошая практика для общего программирования. – caf

+0

@mipadi Я щелкнул ссылку и пошел внутрь источников и проверил http://ftp.gnu.org/gnu/glibc/. В любом из файлов .tar.gz нет math.h. Я просто хочу посмотреть на sqrt(). Не писать оптимизированную функцию. Просто посмотреть, как C это – Jsmith

6

Многие функции стандартной библиотеки C имеют исходный код листинги & обсуждения в The C Programming Language by Kernighan & Ritchie. Обсуждения - это полезный способ узнать больше о специфике языка C & о том, как функции в стандартной библиотеке работают под капотом.

+2

Многие функции в K & R показаны в упрощенной форме, но это может быть лучше, если они используются для примеров. –

+2

K & R должен быть необходим для чтения для любого программирования в C. Очень немногие написали что-то настолько хорошее на стольких страницах. – NoMoreZealots

+1

Это лучшее предложение, чем просмотр реальных библиотек. Они были написаны с целью обучения C, а не для того, чтобы иметь самую эффективную библиотеку C. – caf

1

Here you go

Реализация будет несколько отличаться в зависимости от ОС OS, но реализация GNU/Linux, вероятно, будет самым легким, чтобы найти там.

4

Посмотрите на реализацию стандартной библиотеки C libc. Чтобы увидеть, как реализуется реальная, популярная библиотека C, попробуйте взглянуть на код glibc. Вы можете получить доступ к коду с помощью мерзавца:

GIT клон мерзавца: //sourceware.org/git/glibc.git

Что касается C++, вы можете найти GlibC++ стандартной библиотеки на одном из этих зеркал:

http://gcc.gnu.org/mirrors.html

Вы также можете проверить uLibc, который, вероятно, будет проще, чем библиотека GNU:

http://git.uclibc.org/uClibc/tree/

Чтобы дать вам вкус, вот реализация strncpy из uLibc:

Wchar *Wstrcpy(Wchar * __restrict s1, const Wchar * __restrict s2) 
{ 
    register Wchar *s = s1; 

#ifdef __BCC__ 
    do { 
     *s = *s2++; 
    } while (*s++ != 0); 
#else 
    while ((*s++ = *s2++) != 0); 
#endif 

    return s1; 
} 

Вот strcmp и strstr

+5

Отличный пример того, почему реализация реализаций реальной библиотеки C не является хорошим руководством для общеприменимых хороших методов программирования - наличие этих двух слегка реконфигурированных версий одного и того же цикла для разных компиляторов C почти никогда не будет оправдано в большинстве программ, которые вы сделаю. – caf

2

"Standarc C Library" является спецификацией. Вам нужны источники для реализации спецификации. Ваш компилятор C может предоставить или не предоставить такие источники - тот, который делает это GCC.

0

Если вы используете Visual Studio Professional или команду, вы должны быть в состоянии найти источник здесь :

C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ crt \ src

6

Большинство компиляторов предоставляют исходный код библиотеки - однако исходный код обычно более сложный и запутанный, чем вы могли ожидать.

Хороший ресурс для этого - P.J. Plauger's book, "The Standard C Library", который может быть выполнен довольно дешево, если вы идете на подержанный. Представленный код не всегда прямолинейный, но Plauger объясняет это довольно хорошо (и дает причины, по которым он не всегда может быть прямым и по-прежнему следовать стандарту).

+1

Upvote для ссылки на книгу! – zack

+0

Вау - похоже, что использованные копии уже не дешевы. Около 45 долларов США являются нижним. Интересно, почему? –

+0

Спасибо, мой друг :) – zack

14

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

И, конечно же, это говорит только о практике кодирования С.

Это не имеет ничего общего с практикой кодирования на C++, которая очень отличается. Не относитесь к ним как к одному языку. Нет такой вещи, как C/C++. C - это язык со своими правилами кодирования и распространенными идиомами, а C++ - отдельный независимый язык, который также имеет свои собственные практики и идиомы.

Хороший код C редко бывает хорошим кодом на C++. strcpy и другие функции библиотеки C: обязательно не очень хороший код на C++.

+0

Это была моя первая мысль, когда я увидел этот вопрос. Можно утверждать, что лучшие C-библиотеки имеют специфический процессор. Общий C lib, написанный только на C и минимальный объем функциональности процессора/архитектуры, будет иметь дрянную производительность по сравнению с целевой библиотекой для конкретной системы. Это еще больше беспокоит портативные платформы, где общие оправдания для неэффективного кода не применяются. (т. е. он не будет запускаться на окто-ядерном процессоре с тактовой частотой 3 + ГГц с бесконечной памятью.) – NoMoreZealots

+0

Извините, если это звучало в проповеди, но меня раздражает каждый раз, когда я загружаю свой компьютер, и это занимает больше времени, чем система, которую я имел 20 лет назад , Люди берут аргумент «малоэффективности» до уровня безумия на современных системах. Весь «нетбук» и карманный рынок заставляют меня головокружительно, когда я слышу, как люди скулят по поводу «это недостаточно мощный» для приложений. Теперь вам действительно нужно ДУМАТЬ, разве это не сука! – NoMoreZealots

+0

Я полностью согласен, но иду с другого направления. Я пишу научные приложения для работы на кластерах с 1000 ядрами. В этом масштабе эти небольшие недостатки действительно складываются. За 18 месяцев, когда мы получаем новую систему с удвоенной проблемой, наши проблемы, по крайней мере, удвоились по размеру. Аппаратное обеспечение никогда не собирается догонять то, что мы хотим сделать. – KeithB

0

В общем, я считаю, что BSD libc намного легче читать, чем GNU. Есть меньше «gcc-isms», ядро ​​намного яснее в намерениях и т. Д. Например, BSD code for malloc вполне читаем по сравнению с glibc

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