我有一个嵌入式操作系统,需要在编译时静态定义其资源。
例如:
#define NUM_TASKS 200
目前,我有一个头文件,每个开发者都需要声明他/她所需的任务,就像这样:
#define ALL_TASKS ( \
1 + \ /* need one task in module A */
2 \ /* need two tasks in module B */
)
在操作系统编译期间,会进行一项检查:
#if (ALL_TASKS > NUM_TASKS)
#error Please increase NUM_TASKS in CONF.H
#endif
当我编译时,需要更多的任务,编译就会停止,并明确告知静态操作系统没有足够的任务来使其工作。
目前为止还好。
懒惰的程序员忘记将他在模块A中添加的任务添加到目录x/y/z/foo/bar/baz/中的全局声明文件中。
我想要的是以下构造,但我似乎无法通过任何宏技巧实现:
使用宏声明模块中所需的资源,如下所示:
OS_RESERVE_NUMBER_OF_TASKS(2)
在这个模块中,将全局任务数量增加2。
我的第一个粗略想法是这样的:
#define OS_RESERVE_NUMBER_OF_TASKS(max_tasks) #undef RESOURCE_CALC_TEMP_MAX_NUM_TASKS \
#define RESOURCE_CALC_TEMP_MAX_NUM_TASKS RESOURCE_CALC_MAX_NUM_TASKS + max_tasks \
#undef RESOURCE_CALC_MAX_NUM_TASKS \
#define RESOURCE_CALC_MAX_NUM_TASKS RESOURCE_CALC_TEMP_MAX_NUM_TASKS \
#undef RESOURCE_CALC_TEMP_MAX_NUM_TASKS
但是这样做行不通,因为在一个#define中嵌套另一个#define是无效的。
所以问题基本上是:
您有想法如何将任务数量的计算拆分到多个文件(即模块本身)中,并在编译时将该数字与定义的最大任务数进行比较吗?
如果这不能通过纯C预处理器解决,那么我必须等到我们更改构建系统为scons...
static_assert
而不必使用奇怪的预处理器技巧。 - Drew McGowen