我有一个C程序,它总是使用硬编码的define语句进行一些设置。实施例...
#define TRIGGER_TIMEOUT 50000
这很好用。现在,此设置将变为可调整。实施例...
g_ulTriggerTimeout = ReadEEPROM(TRIGGER_TIMEOUT_OFFSET);
如果检测到持久存储(EEPROM),则将读入并使用该值。因此,我的安全字面值现在有被破坏的风险(无意中写入已更改)。我需要使这个变量保持不变,但是我还需要读取EEPROM的初始值。这种情况通常如何解决?
答案 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中读取),则无法将其锁定以防止程序修改。
虽然可能有平台特定的方法来实现这一目标。