【发布时间】:2016-04-04 22:55:54
【问题描述】:
假设我有一个我想在内部使用的函数,例如 Java 或 C++ 中的 private,但我正在用 C 编写。在这种情况下,我有一个头文件和一个 c 文件实现以及 @ 987654323@ 文件有几个最终用户不应该使用的功能。我可以不在头文件中声明这些函数以防止访问它们,还是这是不好的做法/有更好的方法吗?
【问题讨论】:
-
这正是静态函数的用途。
假设我有一个我想在内部使用的函数,例如 Java 或 C++ 中的 private,但我正在用 C 编写。在这种情况下,我有一个头文件和一个 c 文件实现以及 @ 987654323@ 文件有几个最终用户不应该使用的功能。我可以不在头文件中声明这些函数以防止访问它们,还是这是不好的做法/有更好的方法吗?
【问题讨论】:
制作这样的内部函数static并将其保存在.c文件中。
如果一个函数只能在声明它的文件中被调用,那么将它声明为一个静态函数是合适的。当函数被声明为静态时,编译器现在将编译为目标文件,以防止从其他文件中的代码调用该函数。
或者在 C 标准中:
6.2.2 标识符的链接
...
如果对象或函数的文件范围标识符的声明包含存储类 说明符static,标识符有内部链接。1
1 一个函数声明只能在文件范围内包含存储类说明符 static ....
【讨论】:
直接在.c文件中将这些函数声明为静态函数,并在同一个文件中提供函数的定义:
Ì在 .c 文件中:
static void internal_func1(void);
static int interal_func2(int a);
static void internal_func1(void)
{
/* body of internal_func1 */
}
static int interal_func2(int a)
{
/* body of internal_func2 */
}
添加static 关键字使这些函数对其他源文件不可见(函数标识符将具有内部链接)。
【讨论】:
这就是你在这种情况下要做的,并将静态添加到声明的函数中。您可以在 .h 文件中声明您的公共函数,在 .c 文件中声明私有函数。
假设您有一个 .h 和 .c 文件:
void doSomething1(void);
void doSomething2(void);
static void doSomething3(void);
static void doSomething4(void);
//These functions can be called by anyone
void doSomething1(void)
{
//function guts here
}
void doSomething2(void)
{
//function guts here
}
//These functions can only be called inside this file
static void doSomething3(void)
{
//function guts here
}
static void doSomething4(void)
{
//function guts here
}
【讨论】:
是的,可以使头文件中的某些功能不可用。
其他选项是将头文件分成2个。一个供内部使用,另一个供外部用户使用。
除此之外,您还可以将函数声明为静态,使其在文件范围之外不可见
【讨论】: