处理程序应该是全局的还是静态的?

时间:2014-02-24 14:04:44

标签: c static tree global handle

我正在为解析器实现一个命令树来行走。为了允许库的用户将自己的命令添加到树中,我提供了一个调用用户编码的处理程序的句柄。

用户通过创建为每个要注册的命令调用库函数的处理程序来使用它,并在命令和命令处理程序本身的句柄上传递一些细节。

当解析器然后遍历树时,它可以找到命令处理程序的句柄并调用该函数。

我的问题是,处理程序是否应该在全球范围内可用? (即头文件中的extern声明)。因为我有一个保存到树上的每个人的句柄,严格来说,他们不要需要是全局的,但我认为从语义上讲,它们是从它们定义的文件外部调用的,所以也许他们应该是?

一个例子:

库用户可能拥有文件myOwnTreeCommands.c

/* This function has its handle passed to the library which is called by the library 
 * when building the tree. 
 */
int16_t registerUserCommands (void) {
    /* The user adds the following to register one user command, thus providing a handle 
     * for the command, to the tree structure. 
     */
    return registerChild (&cmdHandler);
}

/* This function then provides the handler for the registered user command. */
int16_t cmdHandler (void) {
    /* ... Here the user can then add code to make the registered command
     * perform the action they require.
     */
}

那么cmdHandler()应该通过myOwnTreeCommands.h制作全局,还是静态的,即使它不是全局的?这种情况是否有标准模式/最佳实践?感谢

1 个答案:

答案 0 :(得分:1)

我会让他们static,因为如果可能,我认为它总是更好。它最大限度地减少了界面的“表面积”,这总是很好。

如果函数是static,代码的读者可以知道它们永远不会从外部直接引用,这是一件好事。