Getter用于C中的只读变量

时间:2016-05-13 13:21:55

标签: c initialization getter

我正在写一个图书馆。该库有一个inline函数,用于初始化一些内部变量。这些变量必须可以从外部访问,但只能以只读方式访问。

因为我正在使用嵌入式设备,所以拥有真正的 getter 功能太过庞大。

除了这两个解决方案之外我可以使用什么好的解决方案(假设它们都是不好的解决方案):

使用_internal_parameter getter(其中static不能为inline int get_parameter() { extern int _interal_parameter; return _internal_parameter; } ):

const

使用const// lib.c void init() { *(int*)&parameter = 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
            );

3 个答案:

答案 0 :(得分:2)

没有很好的封装方式。

真正的封装只能通过创建变量static并使用非内联getter访问它来实现。这将始终返回所述变量的副本。

您的第二个版本是未定义的行为。

答案 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