Разделить статическую функцию в другой файл (заголовок?) В C - PullRequest
0 голосов
/ 22 декабря 2018

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

logic.h:

#ifndef LOGIC_H
#define LOGIC_H

enum logic_type{
    customer_logic = 1,
    requestor_logic,
    company_logic
}

void execute_logic(enum logic_type logic_type);

#endif //LOGIC_H

logic.c:

#include "logic.h"

static void _execute_customer_logic();
static void _execute_requestor_logic();
static void _execute_company_logic();

void execute_logic(enum logic_type logic_type){
    switch(logic_type){
        case customer_logic:
            _execute_customer_logic();
            break;
        case requestor_logic:
            _execute_requestor_logic();
            break;
        case company_logic:
            _execute_company_logic();
            break;
    }
}

void _execute_customer_logic(){
    //very long and complicated function
}

void _execute_requestor_logic(){
    //very long and complicated function
}

void _execute_company_logic(){
    //very long and complicated function
}

С текущим дизайном это выглядит очень грязно.Поэтому я думал о том, чтобы поместить каждую логику в отдельный частный заголовочный файл, а затем просто включить его.Как

company_logic_internal.h:

#ifndef COMPANY_LOGIC_INTERNAL_H
#define COMPANY_LOGIC_INTERNAL_H

    void _execute_company_logic(){
        //very long and complicated function
    }

#endif //COMPANY_LOGIC_INTERNAL_H

Проблема заключается в том, что я помещаю реализацию в файл заголовка, который выглядит противоречащим определению файлов заголовка, который содержит прототипы функций, но не фактическиеопределение.Создание company_logic.h в качестве company_logic.c также выглядит странно, поскольку это означает, что файл .c будет включен.

Так что я не совсем понимаю, как реализовать такую ​​вещь лучше.

1 Ответ

0 голосов
/ 22 декабря 2018

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

, поэтому вместо того, чтобы указывать количество заголовочных файлов (.h файлов), перейдитедля файлов .c, то есть каждая функция может быть определена в отдельных файлах .c и создавать static library (например: company_private.a), вы не упомянули, какой компилятор вы используете, но с помощью gcc вы можете контролировать доступ кбиблиотека с параметром visibility или --exclude-libs (хотя не уверена, что она поддерживается всей цепочкой инструментов) во время компиляции и связать ее с программой, в которой вы хотите использовать эти API.

для простого игрушечного примера создания статическогоПроверка библиотеки по ссылке http://www.codingfleets.com/2018/12/how-to-create-static-library-in-c.html

Если вы используете цепочку инструментов gcc, вы можете найти много документации по ограничению видимости символов в Интернете.

...