如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
Is it bad practice to declare a C function as static if it can still be executed indirectly (through a callback function)?
我有一个用于嵌入式系统的C模块(foo.c
,foo.h
(,其中包含一个从API角度来看在范围内是本地的函数my_driver_fn()
(例如,不在foo
的公共标头中:任何其他通过#include "foo.h"
使用其API的代码都不应该被允许调用这个函数(。假设my_driver_fn()
是可重入的。
但是,foo
使用库libdostuff
,需要使用一些用户提供的回调函数(特定于体系结构/硬件的东西(进行初始化,以便在任何平台上正常工作。在foo
中,上面提到的my_driver_fn
将是有问题的函数之一......libdostuff
需要,但不是任何使用foo
的人都需要的。
对于这些回调函数(my_driver_fn()
在foo.c
中声明为static
,是形式不好,危险,不利,以任何方式阻碍编译器,还是编译器可以利用的未定义行为?鉴于它的地址是提供给libdostuff
并且它是"间接"调用的(尽管从不直接调用(?
注意:我碰巧同时编写foo
和libdostuff
,我想知道在链接时extern
和纯粹解析用户提供的函数是否更有意义,或者通过初始化函数中提供的用户提供的回调表传递到libdostuff
中(例如libdostuff_init(CallbackTable *user_callbacks)
其中CallbackTable
有一个函数指针,该指针将被初始化为指向my_driver_fn
在我看来,这是很好的做法。static
是指名称的可见性,仅此而已。
如果该名称不需要被其他翻译单元使用,则将其标记为static
可以降低外部可见函数的"命名空间"中发生冲突的风险。
这是很好的做法,没有负面的副作用,比如定义不清的行为。
使用static
有很多原因,比如减少命名空间污染和避免意外/有意调用。但主要原因其实是私有封装设计和自文档代码——将函数保留在它们所属的模块中,这样外界就不用担心如何以及何时调用它们。他们应该只关心你在公共头文件中声明的外部链接函数。
例如,这正是您在嵌入式系统中设计 ISR 的方式。应始终将它们声明为static
,并放置在控制 ISR 相关硬件的驱动程序中。与 ISR 的所有通信(包括争用条件保护(都应封装在该驱动程序中。调用应用程序从不直接与 ISR 通信,也不必担心重入等。DMA 缓冲区也是如此。
例如,我总是为所有MCU项目设计一个循环计时器驱动程序,其中调用方的API允许它们注册简单的回调函数。然后,计时器驱动程序在计时器经过时从 ISR 内部调用回调。然后,这可以用作所有需要计时器的低优先级任务的通用计时器:延迟、去抖动等。然后,调用方只需负责任地保持回调函数最小,并以毫秒为单位指定时间,但调用方不知道或不关心计时器硬件,计时器硬件对它执行的回调一无所知。两个方向的松耦合。此计时器 API 还用作 HAL,因此您可以将代码移植到另一个 MCU,而无需更改调用方代码 - 只需更改底层驱动程序。
这是很好的做法。 它确保函数只能由显式提供回调的代码调用。 如果它有外部联系,任何东西都可以称之为它,无论它是否有意义。 滥用显然不是不可能,但确实使意外更难做到。
- enable_if转换构造函数(静态强制转换,is_base_of)
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查编译时是否存在静态函数
- 名称隐藏对静态函数继承的实例使用
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中使用非静态类函数的函数
- 类中静态函数C++意外结果
- 在工人类中使用不同类的静态函数进行实验
- 类 Referention 中C++回调函数引用非静态函数
- 指向模板上下文中的成员函数或静态函数的指针
- 如何检测 Clang AST C++中的静态函数
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 如何在静态函数中使用成员函数数组
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 生成代码(在编译时)以调用模板的每个实例化的静态函数
- C++无法访问或使用静态函数
- C++标准是否定义了结构中成员函数的函数内定义是否必须具有静态链接?
- C++ - 模板类 -> 静态函数 -> 静态函数指针的链接错误