3

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

可以说我有功能

void Foo(int a)
{
 ...
}

我想做这样的事情

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

并且在编译时我想生成这个(如果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

4

2 回答 2

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.
}
于 2013-09-09T15:50:31.393 回答
0

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

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

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

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

于 2013-09-09T19:51:38.813 回答