Понимание синтаксиса заголовка C - PullRequest
2 голосов
/ 29 января 2012

Я новичок в C. Я путешествовал по math.h, искал его математические алгоритмы, но встретил только такие строки:

_CRTIMP double __cdecl sin (double);
_CRTIMP double __cdecl cos (double);
...

Теперь я не смог найти алгоритмсам.Я знаю, что _CRTIMP - это разновидность библиотеки времени выполнения C, но я просто не могу понять, что означает вся строка.Не могли бы вы объяснить, пожалуйста?

Кроме того, я хотел бы знать, где определены эти функции.

Ответы [ 3 ]

5 голосов
/ 29 января 2012
Заголовки

C обычно содержат только функции объявления прототипа , а не определения .Прототипы функций определяют, что называется «сигнатурой функции»: возвращаемое значение, аргументы и иногда соглашение о вызовах (когда и где компиляторы поддерживают это).Определения функций находятся в отдельном исходном файле, который компилируется отдельно от вашего (включая любые заголовки вашего исходного файла # include).Определения библиотечных функций могут быть в C, они также могут быть в сборке, но это не должно иметь значения для вашего кода (только для вашего любопытства).Но вы, вероятно, не собираете их сами в любом случае;вместо этого ваша среда разработки / операционная система поставляется со стандартной библиотекой (двоичным объектным файлом), которая содержит множество уже скомпилированных функций.Ваша среда разработки просто связывает ваш код с этой библиотекой.

3 голосов
/ 29 января 2012
Заголовочные файлы

C будут содержать только объявление функций, а не их определения.

Вы ищете исходный код функций, объявленных в math.h, вот одна реализация sin: http://fxr.watson.org/fxr/source//arch/i386/math-emu/poly_sin.c?v=linux-2.4.22

2 голосов
/ 29 января 2012

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

Они также имеют тенденцию иметь много #ifdef s, поэтому одни и те же заголовки могут использоваться в разных системах.

Если вы просто хотите узнать, например, как использовать функцию sin, вам лучше прочитать документацию по вашей системе.Например, в моей системе Ubuntu man sin показывает это (среди прочего):

SYNOPSIS

   #include <math.h>

   double sin(double x);
   float sinf(float x);
   long double sinl(long double x);

   Link with -lm.

_CRTIMP и __cdeclВозможно, это важно для компилятора, но как программист вы можете спокойно их игнорировать.

Если вы ищете исходный код, который реализует функцию sin, она может или не может бытьбыть доступным.Это может быть написано на языке, отличном от C;даже были системы, в которых это реализовано аппаратно (хотя небольшая оболочка все еще требовалась).

В другом ответе содержится ссылка на одну реализацию, но, вероятно, она не используется в вашей системе.

И вам не нужно слишком зацикливаться на том, как реализована функция sin.Это, безусловно, полезно знать, но вам не нужна эта информация для написания кода, который ее использует.(Я абсолютно не не хочу препятствовать любопытству.)

...