我正在为解析器实现一个命令树来行走。为了允许库的用户将自己的命令添加到树中,我提供了一个调用用户编码的处理程序的句柄。
用户通过创建为每个要注册的命令调用库函数的处理程序来使用它,并在命令和命令处理程序本身的句柄上传递一些细节。
当解析器然后遍历树时,它可以找到命令处理程序的句柄并调用该函数。
我的问题是,处理程序是否应该在全球范围内可用? (即头文件中的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
制作全局,还是静态的,即使它不是全局的?这种情况是否有标准模式/最佳实践?感谢
答案 0 :(得分:1)
我会让他们static
,因为如果可能,我认为它总是更好。它最大限度地减少了界面的“表面积”,这总是很好。
如果函数是static
,代码的读者可以知道它们永远不会从外部直接引用,这是一件好事。