在构建(编译)时生成代码

时间:2013-09-09 15:13:36

标签: c++

这可能是一个愚蠢的问题,但仅仅是好奇心,我想知道这样的事情是否可能。

让我说我有功能

void Foo(int a)
{
 ...
}

我想做这样的事情

@pragma mypragma
void Foo(int a)
{
 ...
}

在编译时我想生成这个(如果在函数之前定义了pragma mypragma

void Foo(void * ptr, int a)
{
    Foo(a);
}

void Foo(int a)
{
 ...
}

或带有返回值

int Foo(void * ptr, int a)
{
    return Foo(a);
}

int Foo(int a)
{
 ...
}

编辑:一些例子。我想要的是OpenMP

2 个答案:

答案 0 :(得分:2)

我认为这样的事情对你有用。您需要单独的宏来返回值,而不是每个可能的参数数量。

// pt<x>: Parameter type <x>
// pn<x>: Parameter name <x>

#define METHOD_PAIR1(name, pt1, pn1) \
void name(pt1 pn1); \
void name(void* ptr, pt1 pn1) { name(pn1); } \
void name(pt1 pn1)

#define METHOD_PAIR2(name, pt1, pn1, pt2, pn2) \
void name(pt1 pn1, pt2 pn2); \
void name(void* ptr, pt1 pn1, pt2 pn2) { name(pn1, pn2); } \
void name(pt1 pn1, pt2 pn2)

#define FUNCTION_PAIR1(ret, name, pt1, pn1) \
ret name(pt1 pn1); \
ret name(void* ptr, pt1 pn1) { return name(pn1); } \
ret name(pt1 pn1)

#define FUNCTION_PAIR2(ret, name, pt1, pn1, pt2, pn2) \
ret name(pt1 pn1, pt2 pn2); \
ret name(void* ptr, pt1 pn1, pt2 pn2) { return name(pn1, pn2); } \
ret name(pt1 pn1, pt2 pn2)

METHOD_PAIR1(Foo, int, a)
{
    // Insert body of void Foo(int a) here.
}

FUNCTION_PAIR1(int, Foo2, int, a)
{
    // Insert body of int Foo2(int a) here.
}

答案 1 :(得分:0)

当然,你可以像David建议的那样使用C预处理器,但是当你手头有更复杂的任务时,你应该考虑其他工具来生成你需要的代码。

我在使用中看到的此类预处理器的示例包括m4python

python似乎更适合您想象的语法,但是,您不能将其作为预处理器执行,您必须在文件上运行python程序以生成期望的输出。

另一方面,

m4是一个真正的预处理器,这意味着您基本上将源文件直接提供给m4,就像您的编译器通过C预处理器提供C文件一样。它的语法在风格上非常实用,取决于你想要实现的目标,这可能是好的还是坏的。