代码之家  ›  专栏  ›  技术社区  ›  kocica

如何创建外部不可修改的变量?

  •  4
  • kocica  · 技术社区  · 6 年前

    我正在开发简单的模拟库,遇到了一个问题,我在哪里进行了模拟 Time 变量,其中 不应该 API用户(程序员)在任何情况下都可以修改(仅提供模拟时间的信息),但

    这是我想到的,但对我来说似乎有点棘手

    double simTime;                // Internal time, modified by library
    const double& Time = simTime;  // Time info provided for programmer in API
    

    有没有一种方法可以做到这一点 const double& ?

    3 回复  |  直到 3 年前
        1
  •  10
  •   Georgi Gerganov    6 年前

    而不是 const double & 您可以更改API以提供函数 double getTime(); simTime .

        2
  •  5
  •   Stephan Lechner    6 年前

    我发现 const double&

    唯一的问题是,您的库应该声明 simTime static 或者在匿名命名空间中,这样就无法从外部对其进行寻址。否则,任何 extern double simTime 在任何其他翻译单位都会暴露 同时 .

    所以写。。。

    // library.cpp:
    static double simTime;
    const double &simTimePublic = simTime;
    
    // library.h:
    extern const double &simTimePublic;
    
    // userCode.cpp:
    #include "library.h"
    ...
    double simTimeCopy = simTimePublic;
    
    // simTimePublic = 1.0; // illegal
    
        3
  •  1
  •   Basile Starynkevitch    6 年前

    您甚至可以(在公共标题中)定义一些 内联 函数返回一个外部变量,其名称足够长,不容易猜测,例如。

    static inline double getTime(void) {
      extern double somelongname_simTime; // don't use that name directly
      return somelongname_simTime;
    }
    

    somelongname_simTime 是公共的,但需要直接使用用户的恶意(因为它未在公共头文件的文件范围中声明)。

    (你甚至可以使用 namespace

    请注意,编译器无法阻止未定义的行为,例如指针意外获取 static 变量

    visibility 把戏。


    具有 GCC 明确地 您可以尝试在同一全局内存位置使用两个名称(使用 assembler labels

    extern volatile const double simTime_public asm ("myrealsimTime");
    

    在一些实现文件中,您将使用

    double simTime_private asm("myrealsimTime");
    

    (很明显,您可以将这两种方法混合使用)。