仅从标题中公开一小部分函数

时间:2017-03-01 21:42:59

标签: c

我有一个 "头文件" (file1.h)有多个函数原型声明和一个 " C文件"(file1.c)具有关联的函数定义。

我想只从"头文件"中公开特定的函数原型。 (file1.h)到另一个" C文件" (file2.c)没有暴露其余的功能。

问题1:最好的方法是什么? 选项:创建另一个标头,其中只包含(file2.c)

中包含的所需功能

问题2& 3:什么时候会extern派上用场? 我在头文件中的某些函数中看到了extern的使用,而其他函数没有使用该关键字。这个想法是什么?

2 个答案:

答案 0 :(得分:2)

易。对于" public"函数原型/声明,将它们放在.h文件中。

<强> func.h

int func1(void);
int func2(int i);

对于您不想曝光的功能,只需将它们放在.c文件中即可。

<强> func.c

/* Function prototypes. */
static int func3(void);

/* Function definitions. */
int func1(void) {
    func3();
    return 0;
}

int func2(int i) {
    func3();
    return (i + i);
}

static int func3(void) {
    return 42;
}

接下来,根据您的编译器,设置exported symbol whitelist(例如:gcc hidden attributes,例如,在Linux上),以限制导出的符号。

最后,strip编译后的最终二进制文件(即:strip --strip-unneeded myfile.so),并且您已全部设置完毕。即使用户知道正在使用的API,您的&#34;私人&#34;符号只能通过非便携式黑客直接访问。

享受!

答案 1 :(得分:0)

公开API中的一些函数(这是Motif GUI库如何做)的一种常见方法是在MyThing.h中为公共可用函数放置原型,然后将其余函数放在MyThingI.h中, #includes MyThing.h,你的.c文件包含MyThingI.h(我是内部的)。这样,您自己的代码可以包含多个包含I.h文件的文件,而随库提供的公共.h文件只包含.h文件。

.h文件中的所有原型都应使用“extern”关键字。