【发布时间】:2017-10-23 22:00:27
【问题描述】:
我有以下结构(在嵌入式系统上):
struct Calib_Time_struct
{
uint16_t year;
uint16_t month;
uint16_t day;
uint16_t hour;
uint16_t minute;
uint16_t seconds;
};
我有一个“默认”值数组,我需要在其中插入时间值:
struct Calib_Table_struct
{
unsigned int table_id; //!< Table identifier.
char group_name[CAL_TBL_MAX_GROUP_NAME_LENGTH];
unsigned int channel_number; //!< Channel number within the group.
float floor_value; //!< Minimum value for a channel.
unsigned int size; //!< Number of elements in the table.
struct Calib_Time_struct modification_date; //!< Date of modification.
};
static const struct Calib_Time_struct default_values[] =
{
// Table 0
{
.table_id = 0U,
.group_name = "ADC",
.channel_number = 0U,
.floor_value = 0.0f,
.size = 1,
.modification_date =
{
.year = /* extract from __DATE__ macro */;
},
},
//...
};
我想在__DATE__宏中填写“modification_date”成员的年月日。
有没有办法做到这一点? (任何黑客攻击?)
可以将类似的方法或技巧应用于__TIME__ 宏吗?
动机是允许编译器(在构建服务器上)自动插入值,而不是让开发人员这样做。我们团队中有许多开发人员,并使用构建服务器来制作“官方”构建,然后交付给我们团队以外的人。
数据将附加到可执行文件并存储在闪存中,由引导加载程序下载到内存中。
默认数组中有很多(超过 80 个)表。
我的工具:
IAR Systems IDE 和编译器:7.4
使用 ARM Cortex-A8 的嵌入式系统平台。
语言:主要用 C 语言,但可能对 C++ 语言的人有用。
【问题讨论】:
-
default_values不是常量表达式,因此您可以在程序开始时动态填充它,不是吗? (不完美的性能明智,ik) -
default_values是一个常量表达式,为了简单更新,这个结构在main()之前和里面都没有修改。 -
不,不是。它只是一个 const 对象,编译不依赖于它的值是否可用。您可以简单地使用函数调用来初始化它,该函数调用使用 C 或 C++ 而不是 PP 解析
__DATE__字符串。我不知道您所说的“更新简单”是什么意思,您当然可以将编译时间作为您的要求,但目前没有说明。
标签: c++ c date macros c-preprocessor