0

我在一个库中有几个头文件:header1.hheader2.h...我还有一个用于库的通用头文件:mylib.h

我希望用户导入文件并main.h访问其他头文件中的一些功能。

例如,在库中:

// header1.h
void a(void);
void b(void);

-

// mylib.h

// I can't use this:
#include "header1.h"
// because it would make b function visible.

// Link to function a ????????

在我的主程序中:

// main.c
#include "mylib.h"

int main(void) {

    a(); // Visible: no problem
    b(); // Not visible: error

    return 0;
}
4

3 回答 3

2

将函数原型分成不同的标题,具体取决于它们是否应该是“可见的” *1(但应该是“内部的”)。

  • header1_internal.h
  • header1.h
  • header2_internal.h
  • header2.h
  • ...

*_internal.h标题中包含相关的*.h标题。

将标头包含*_internal.h到您的库的相关模块中。

不要将任何内容包含*_internal.hmylib.h.


*1:请注意,即使不以这种方式提供原型,用户也可以很好地制作他/她自己的原型,然后从mylib. 因此,未原型化的功能并非不可访问。

于 2017-01-04T16:17:52.457 回答
0

如果void b(void)其他头文件不需要,并且您可以访问源文件,那么将声明移动到源文件中呢?

// header1.h
void a(void);
//void b(void);

// header1.c
/* some #include here */
void b(void);
/* other code here */
void b(void) {
    /* implement it */
}
于 2017-01-04T16:20:44.787 回答
0

头文件仅包含应该由头用户访问的功能。它们代表公共接口。

首先观看: 将代码组织成多个文件 1 YouTube 链接:将代码组织成多个文件 1

将代码组织成多个文件 2 YouTube 链接:将代码组织成多个文件 2

此外,您可以参考Brian Gough 的 Introduction To GCC,以更深入地了解使用 gcc 的编译和链接过程。

于 2017-01-04T17:12:18.967 回答