我正在写一个图书馆。该库有一个inline
函数,用于初始化一些内部变量。这些变量必须可以从外部访问,但只能以只读方式访问。
因为我正在使用嵌入式设备,所以拥有真正的 getter 功能太过庞大。
除了这两个解决方案之外我可以使用什么好的解决方案(假设它们都是不好的解决方案):
使用_internal_parameter
getter(其中static
不能为inline int get_parameter() { extern int _interal_parameter; return _internal_parameter; }
):
const
使用const
(// lib.c
void init() {
*(int*)¶meter = get_value_for_parameter();
}
// lib.h
extern const int parameter //!< initialized by init();
变量未受到真正保护的地方):
SELECT *
FROM Engines e
JOIN Transmissions t
ON e.carId = t.carId
WHERE ( e.engineId IN ( @a )
OR ISNULL(@a, 0) = 0
)
AND ( t.transmissionId IN ( @b )
OR ISNULL(@b, 0) = 0
);
答案 0 :(得分:2)
答案 1 :(得分:2)
在C中,将数据设为私有的唯一方法是将其隐藏在编译单元中。 这可以通过使用静态变量(如果变量是全局的)或通过在编译单元中定义将使用它的结构。
然后,您可以声明一个非静态函数,该函数通过值或const引用(使用const指针)返回值。这将强制您创建一个正常的功能。内联无效,因为变量隐藏在编译单元中。
如果函数的开销太高,您将被迫将变量声明为非静态(或声明您的结构)。在这种情况下,没有什么可以阻止用户更改变量。
可能有第三种方法,那就是声明你的变量static,然后创建一个非静态const指针,指向将暴露在函数外部的变量。在这种情况下,用户仍然可以使用强制转换进行修改。
答案 2 :(得分:1)
目前尚不清楚为什么使用真正的getter函数会很昂贵。听起来好像你的编译器没有正确地进行内联。此外,函数调用开销的无效性经常被夸大,除非您使用的是一些古老的MCU架构。
最佳当然是:
DesiredCapabilities
或者,如果函数调用实在太昂贵并且您无法找到修复内联的方法,则getter可能会返回//lib.c
int get parameter (void)
{
return parameter;
}
。在调用者中使用本地指针变量,然后只调用一次getter。
请注意,在任何嵌入式系统上使用const int*
几乎肯定是不正确的做法。而是使用有意义的最小类型。它必须签名吗?说“我的应用程序是如此实时关键,我甚至无法调用函数”然后在代码中转储一个草率的int
真的没有意义。
除非变量是真正的只读变量(如闪存中的常量),否则应该避免使用int
。