这可能是一个愚蠢的问题,但仅仅是好奇心,我想知道这样的事情是否可能。
让我说我有功能
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
答案 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预处理器,但是当你手头有更复杂的任务时,你应该考虑其他工具来生成你需要的代码。
我在使用中看到的此类预处理器的示例包括m4
和python
。
python
似乎更适合您想象的语法,但是,您不能将其作为预处理器执行,您必须在文件上运行python程序以生成期望的输出。
m4
是一个真正的预处理器,这意味着您基本上将源文件直接提供给m4
,就像您的编译器通过C预处理器提供C文件一样。它的语法在风格上非常实用,取决于你想要实现的目标,这可能是好的还是坏的。