Разделение группы функций на включаемый файл в C? - PullRequest
3 голосов
/ 01 июня 2010

Я знаю, что это часто встречается в большинстве языков, и, возможно, в Си. Может ли C обрабатывать выделение нескольких функций в отдельный файл и включать их?

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

Ответы [ 4 ]

4 голосов
/ 01 июня 2010

Определенно! То, что вы описываете, это заголовочные файлы. Вы можете прочитать больше об этом процессе здесь , но я обрисую основы ниже.

Ваши функции будут разделены на заголовочный файл с именем functions.h, который содержит следующее:

int return_ten();

Тогда у вас может быть файл functions.c, который содержит определение функции:

int return_ten()
{
    return 10;
}

Тогда в вашем файле main.c вы можете включить functions.h следующим образом:

#include <stdio.h>
#include "functions.h"

int main(int argc, char *argv[])
{
    printf("The number you're thinking of is %d\n", return_ten());

    return 0;
}

Предполагается, что ваш файл functions.h находится в том же каталоге, что и ваш файл main.c.

Наконец, когда вы хотите скомпилировать это в свой объектный файл, вам нужно связать их вместе. Предполагая, что вы используете компилятор командной строки, это просто означает добавление дополнительного файла определения в конец. Чтобы приведенный выше код работал, вы должны ввести в cmd следующую команду: gcc main.c functions.c, которая выдаст файл a.out, который вы сможете запустить.

1 голос
/ 01 июня 2010

Скажем, у вас есть файл с функцией, которую вы хотите использовать в другом месте:

int func2(int x){
/*do some stuff */
return 0;
}

Что бы вы сделали, это разбили это на заголовочный файл и исходный файл. В заголовочном файле у вас просто есть объявление функции, это говорит компилятору, что эта функция существует, даже если она находится в другом файле. Заголовок может называться func2.h, может выглядеть так:

#ifndef HEADER_FUNC2_H
#define HEADER_FUNC2_H
int func2(int x);
#endif /*HEADER_FUNC2_H*/

Часть #ifndef HEADER_FUNC2_H предназначена для того, чтобы убедиться, что это используется только один раз, чтобы не было нескольких определений. затем в исходном файле func2.c у вас есть сама функция:

int func2(int x){
/*do some stuff */
return 0;
}

и в любом другом файле теперь, когда вы используете func2, вы должны включить заголовок. Вы делаете это с помощью #include "func2.h". Например, если мы хотим вызвать func2 из randomfile.c, это будет выглядеть так:

#include "func2.h"
/* rest of randomfile.c */
func2(1);

Тогда последний шаг - связать объектный файл, содержащий функцию, с компилятором при компиляции.

1 голос
/ 01 июня 2010

Объявите функции в заголовочных файлах, а затем внедрите их в файлы .c. Теперь вы можете #include файлы заголовков в любой программе, которая использует функции, а затем связать программу с объектными файлами, сгенерированными из файлов .c.

0 голосов
/ 01 июня 2010

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

Если вы хотите использовать одни и те же определения (например, макросы, типы, ...), вы можете поместить их в заголовочный файл и включить их в #include.

Пожалуйста, воздержитесь от непосредственного "#include" кода функции в исходный файл, это плохая практика и может привести к очень проблемным ситуациям (особенно если вы новичок, как подсказывает ваш тег).

Примите во внимание, что обычно, когда у вас есть набор функций, которыми вы хотите поделиться и использовать повторно, вам понадобятся оба! Обычно вы получаете библиотеку myfuncs.lib (или libmyfuncs.a) и заголовок myfuncs.h.

В программах, в которых вы хотите повторно использовать существующие функции, вы включите заголовок и ссылку на библиотеку.

Вы также можете посмотреть, как использовать динамические библиотеки после того, как освоили использование статических библиотек.

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