我正在学习如何用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
文件。
所以我对如何更好地实现这样的事情感到困惑。
答案 0 :(得分:1)
这不是直接回答问题的方法,但是您可以尝试这样做以避免不必要地暴露您的代码并避免重新编译。
因此,不使用头文件(.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工具链,则可以找到很多有关限制符号在线可见性的文档。