C - 保护持久性设置

时间:2012-04-03 13:22:19

标签: c const

我有一个C程序,它总是使用硬编码的define语句进行一些设置。实施例...

#define TRIGGER_TIMEOUT 50000

这很好用。现在,此设置将变为可调整。实施例...

g_ulTriggerTimeout = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET);

如果检测到持久存储(EEPROM),则将读入并使用该值。因此,我的安全字面值现在有被破坏的风险(无意中写入已更改)。我需要使这个变量保持不变,但是我还需要读取EEPROM的初始值。这种情况通常如何解决?

3 个答案:

答案 0 :(得分:1)

我不喜欢像RedX's answer那样弯曲规则(调用未完成的行为)。因此,我现在提供符合C标准的解决方案。价格具有常数函数而不是常数变量。

int g_ulTriggerTimeout()
{
    static int done; // statically initialized to zero
    static int value;
    if( !done )
    {
        value = haveEEPROM ? ReadEEPROM(TRIGGER_TIMEOUT_OFFSET)
                                      : TRIGGER_TIMEOUT;
        done = 1;
    }
    return value;
}

以下是我的第一个答案,但它仅在C ++中有效:

const int g_ulTriggerTimeout = haveEEPROM ? ReadEEPROM(TRIGGER_TIMEOUT_OFFSET)
                                          : TRIGGER_TIMEOUT;

答案 1 :(得分:1)

这是恕我直言,其中一个例子就是弯曲规则。

const int g_ulTriggerTimeout; //declare somewhere making sure it is in a writable section (see comment below from undur)

/* later */

//just for this assignment make it modifiable
*((int*) &g_ulTriggerTimeout) = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET);

答案 2 :(得分:0)

你不能(携带/使用C)。

如果您必须修改程序中的变量(通过从EEPROM中读取),则无法将其锁定以防止程序修改。

虽然可能有平台特定的方法来实现这一目标。