关于编译时代码生成的问题

时间:2010-07-29 07:10:06

标签: templates macros

我有一个像

这样的要求
void doSomeThing(int x)
{
.....
}

void fun()
{

 #ifdef XXXX_1_YYYY
doSomeThing(XXXX_1_YYYY);
 #endif //XXXX_1_YYYY

 #ifdef XXXX_2_YYYY
doSomeThing(XXXX_2_YYYY);
 #endif //XXXX_2_YYYY

 #ifdef XXXX_3_YYYY
 doSomeThing(XXXX_3_YYYY);
 #endif //XXXX_3_YYYY

 #ifdef XXXX_4_YYYY
 doSomeThing(XXXX_4_YYYY);
 #endif //XXXX_4_YYYY

....
upto XXXX_20_YYYY

}

无论如何,我可以使用一些宏扩展技术或任何其他解决方案来减少这种类型的输入吗?

MACRO定义可以是这样的

#define XXXX_1_YYYY 10
#define XXXX_2_YYYY 20
#define XXXX_3_YYYY 30
#define XXXX_4_YYYY 40
...
#define XXXX_20_YYYY 200

#ifdef中的每一个都不是互斥的。 代码在c ++中

3 个答案:

答案 0 :(得分:0)

也许是一个微不足道的答案,但如果它们都是相互排斥的,那么使用#elif将为你节省很多#endifs。

如果不了解更多关于你真正想要做的事情,很难知道避免这种情况的好方法。所有这些函数都在同一个文件中,每个函数都有一个#if吗?

答案 1 :(得分:0)

我看不到使用标准C预处理器的方法。

也许问题可以重申。你能告诉我们更广泛的背景吗?

请记住,除了滥用C预处理器之外,您始终可以使用其他工具生成代码,例如m4,perl,bash等。或者Windows上的JScript,VBScript等。如果您的构建系统允许,那就是。

答案 2 :(得分:0)

如果存在特殊值XXXX_n_YYYY(对于指针值为NULL,对于int等为-1),则可以使用该特殊值将该常量标记为“未定义”(而不是将其保留为未定义) 。然后你可以使用一些看起来像的代码:

void fun()
{
    size_t i;
    static XYXX_type job_que[] = { XXXX_1_YYYY, XXXX_2_YYYY, .... };

    for (i=0; i!=ARRAY_SIZE(job_que); ++i)
    {
        if (job_que[i] != SPECIAL_VALUE) do_something(job_que[i]);
    }
}

在给定数量的细节的情况下,很难想出更好的东西。