Как определить функцию C в одном файле, а затем вызвать ее из другого? - PullRequest
29 голосов
/ 25 ноября 2010

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

Ответы [ 2 ]

30 голосов
/ 25 ноября 2010

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

12 голосов
/ 25 ноября 2010

Используйте Прямое объявление

Например:

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;
}

Существует функция, которая позволяет вам повторно использовать эти прямые объявления, называемые Заголовочные файлы .Просто возьмите предварительные объявления, поместите их в заголовочный файл, затем используйте #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 / компилятора).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...