我正在为 PIC32MX 编写 C,使用 Microchip 的 PIC32 C 编译器(基于 GCC 3.4)编译。
添加了我遵循的标准是 GNU99(带有 GNU 扩展的 C99,编译器标志-std=gnu99
)
我的问题是:我有一些可重新编程的数字数据存储在 EEPROM 或芯片的程序闪存中。这意味着当我想存储一个浮点数时,我必须做一些类型双关语:
typedef union
{
int intval;
float floatval;
} IntFloat;
unsigned int float_as_int(float fval)
{
IntFloat intf;
intf.floatval = fval;
return intf.intval;
}
// Stores an int of data in whatever storage we're using
void StoreInt(unsigned int data, unsigned int address);
void StoreFPVal(float data, unsigned int address)
{
StoreInt(float_as_int(data), address);
}
我还将默认值包含为编译时间常量数组。对于(无符号)整数值,这很简单,我只使用整数文字。但是,对于浮点数,我必须使用这个 Python 片段将它们转换为它们的单词表示,以将它们包含在数组中:
import struct
hex(struct.unpack("I", struct.pack("f", float_value))[0])
...因此我的默认值数组具有这些难以理解的值,例如:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
0x3C83126F, // Some default float value, 0.005
}
(这些实际上采用X 宏构造的形式,但这在这里没有什么区别。)注释很好,但有更好的方法吗?能够做类似的事情真是太好了:
const unsigned int DEFAULTS[] =
{
0x00000001, // Some default integer value, 1
COMPILE_TIME_CONVERT(0.005), // Some default float value, 0.005
}
...但我完全不知所措,我什至不知道这样的事情是否可能。
笔记
- 显然,“不,这不可能”是一个可以接受的答案,如果是真的。
- 我不太关心可移植性,所以实现定义的行为很好,未定义的行为不是(我面前有 IDB 附录)。
- 据我所知,这需要进行编译时转换,因为
DEFAULTS
它在全局范围内。如果我对此有误,请纠正我。