Подтвердить что ты не робот

Как определить функцию C в одном файле, а затем вызвать ее из другого?

Скажем, я определяю функцию в файле func1.c, и я хочу вызвать ее из файла call.c, как бы я это сделал? Спасибо заранее!

4b9b3361

Ответ 1

Вы разместили бы объявление для функции в файле func1.h и добавили #include "func1.h" в call.c. Затем вы скомпилируете или соедините func1.c и call.c вместе (детали зависят от какой системы C).

Ответ 2

Используйте Forward Declaration

Например:

typedef struct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

Существует функция, позволяющая повторно использовать эти форвардные объявления, называемые Header Files. Просто перейдите в декларации вперед, поместите их в файл заголовка, а затем используйте #include, чтобы добавить их в каждый исходный файл C, в который вы ссылаетесь на передовые объявления.

/* SomeFunction.c */

#include "SomeReferencedFunction.h"

int SomeFunction()
{
   SomeStruct s;
   s.SomeMemberValue = 12;
   s.SomeOtherMemberValue = "test string";

   return SomeReferencedFunction(5, s) > 12;
}

/* SomeReferencedFunction.h */

typedef SomeStruct
{
    int SomeMemberValue;
    char* SomeOtherMemberValue;
} SomeStruct;

int SomeReferencedFunction(int someValue, SomeStruct someStructValue);

/* SomeReferencedFunction.c */

/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"

int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
    if(someStructValue.SomeOtherMemberValue == NULL)
        return 0;

    return someValue * 12 + someStructValue.SomeMemberValue;
}

Конечно, чтобы иметь возможность компилировать как исходные файлы, так и всю библиотеку или исполняемую программу, вам нужно добавить вывод обоих файлов .c в командную строку компоновщика или включить их в один и тот же "проект" (в зависимости от вашего IDE/компилятора).

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