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

C++ 在构建(编译)时生成代码,c++,C++,这可能是个愚蠢的问题,但出于好奇,我想知道这样的事情是否可能发生 假设我有一个函数 void Foo(int a) { ... } void Foo(void * ptr, int a) { Foo(a); } void Foo(int a) { ... } 我想做这样的事情 @pragma mypragma void Foo(int a) { ... } 在编译时,我想生成它(如果在函数之前定义了pragmamypragma) 或具有返回值 int Foo(void *

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

假设我有一个函数

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

void Foo(int a)
{
 ...
}
我想做这样的事情

@pragma mypragma
void Foo(int a)
{
 ...
}
在编译时,我想生成它(如果在函数之前定义了pragma
mypragma

或具有返回值

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

int Foo(int a)
{
 ...
}

编辑:一些示例。我想要的类似于

我想这样的东西会适合你的。您将需要单个宏来返回值与否,以及每个可能的参数数

// 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.
}
//pt:参数类型
//pn:参数名
#定义方法1(名称、pt1、pn1)\
无效名称(pt1 pn1)\
void name(void*ptr,pt1 pn1){name(pn1);}\
无效名称(pt1 pn1)
#定义方法2(名称、pt1、pn1、pt2、pn2)\
无效名称(pt1 pn1,pt2 pn2)\
void name(void*ptr,pt1pn1,pt2pn2){name(pn1,pn2);}\
无效名称(pt1 pn1,pt2 pn2)
#定义函数1(ret、名称、pt1、pn1)\
ret名称(pt1 pn1)\
ret name(void*ptr,pt1 pn1){returnname(pn1);}\
ret名称(pt1 pn1)
#定义功能(ret、名称、pt1、pn1、pt2、pn2)\
ret名称(pt1 pn1,pt2 pn2)\
ret name(void*ptr,pt1-pn1,pt2-pn2){返回名称(pn1,pn2);}\
ret名称(pt1 pn1,pt2 pn2)
方法1(Foo,int,a)
{
//在此处插入void Foo(int a)的主体。
}
函数1(int,Foo2,int,a)
{
//在此处插入int Foo2(int a)的主体。
}

当然,正如David所建议的,您可以使用C预处理器来实现这一点,但是当您手头有更复杂的任务时,您应该考虑使用其他工具来生成所需的代码

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

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


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

哪个编译器?你想归档什么?你不能在VS中定义一个“PrimaMa”,而不是用自己的C++编译器来实现这一点,这真的是个愚蠢的问题。编写一个预处理器,在编译器认为可能之前修改源代码。你得自己写一本。有一天你会后悔吹了这个口哨。@MartinPerry你似乎没有意识到OpenMP需要编译器支持,也就是说,编译器实现OpenMP指定的
#pragma
-API。这不仅仅是正在进行的预处理器魔法。哦,你到底想实现什么?正如其他人所提到的,使用常规预处理器(例如,许多丑陋的宏),您可以实现简单示例中的要求。但是现在你的要求真的很奇怪,也许如果你告诉我们更多关于你正在做的事情,我们可以建议一个更干净的解决方案。另外,如果可以选择您的实现语言的话,Python有函数装饰器,它可能会非常容易和干净地实现您想做的任何事情。@hyde:别忘了提到
moc
,如果它看到了一个通用的“语法错误”,它会随着一个通用的“语法错误”而消亡(例如,
boost.date\u time
)。这正是OP陷入的困境。