2012-01-29 5 views
2

Я новичок в C. Я путешествовал через math.h, ищу свои математические алгоритмы, но встречаюсь только этот вид линий:Понимание C Header Синтаксис

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

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

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

+1

Первой гугле ссылки: http://objectmix.com/c/32997-whats-use-__cdecl.html и ваш ответ: '_CRTIMP просто макрос, который, вероятно, расширяется до некоторой нестандартной спецификации вызова или нечего, в зависимости от нестандартного . «CRT» , вероятно, означает «C Runtime Library». «IMP», вероятно, означает «импорт». __cdecl - спецификатор соглашения о вызовах, поддерживаемый Visual C++ и некоторыми другими компиляторами Windows C++. – Vyktor

+0

Я полагаю, я был недостаточно ясен. Где существует 'cos (double)'? Где сама функция? Кстати, я посетил эту ссылку) –

+1

@MichaelSazonov В заголовках только вы узнаете, какие функции и данные доступны; сами определения содержатся в другом месте (стандартная библиотека C (msvcrt32.dll или что-то в этом роде)) – Dave

ответ

5

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

2

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

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

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

СИНТАКСИС

#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. Это, конечно, хорошая вещь, чтобы знать, но вам не нужна эта информация для написания кода, который ее использует. (Я абсолютно не хочу отбить любопытство.)

+0

Отличный ответ! Ясный и богатый! Большое спасибо! –

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