C/C++宏扩展与代码生成

Vie*_*iet 6 c++ macros code-generation

宏扩展和代码生成都有利弊.你最喜欢的方法是什么?为什么?我们何时应该选择其中一个?请提出建议.谢谢!

宏扩展可以非常方便和有用:http: //dtemplatelib.sourceforge.net/table.htm

VS

代码生成为您提供了大量优秀的代码:http : //code.google.com/p/protobuf/ http://incubator.apache.org/thrift/

Gun*_*iez 9

对于c ++,我更喜欢模板元编程或宏代码生成,但宏仍有其用途.

您使用dbtemplatelib给出的示例可以用c ++ 0x Variadic模板覆盖,还有类型检查等其他好处.


Gre*_*ill 5

在C或C++中,宏扩展非常难以调试.另一方面,编写代码生成器更容易调试,因为它本身就是一个单独的程序.

但是,您应该知道这仅仅是C预处理器的限制.例如,在Lisp语言系列中,宏扩展代码生成,它们完全相同.要编写宏,可以编写一个程序(在Lisp中)将S表达式输入转换为另一个S表达式,然后将其传递给编译器.


Mik*_*vey 2

这是一个权衡。让我举个例子。我在 1985 年左右偶然发现了差分执行技术,我认为它是用户界面编程的一个非常好的工具。基本上,它需要像这样的简单结构化程序:

void Foo(..args..){
  x = y;
  if (..some test..){
    Bar(arg1, ...)
  }
  while(..another test..){
    ...
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

并与这样的控制结构混在一起:

void deFoo(..args..){
  if (mode & 1){x = y;}
  {int svmode = mode; if (deIf(..some test..)){
    deBar(((mode & 1) arg1 : 0), ...)
  } mode = svmode;}
  {int svmode = mode; while(deIf(..another test..)){
    ...
  } mode = svmode;}
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在,一个非常好的方法是为 C 或任何基本语言编写一个解析器,然后遍历解析树,生成我想要的代码。(当我用 Lisp 做这件事时,那部分很简单。)

但谁愿意为 C、C++ 或其他语言编写解析器呢?

因此,我只编写宏,这样我就可以编写如下代码:

void deFoo(..args..){
  PROTECT(x = y);
  IF(..some test..)
    deBar(PROTECT(arg1), ...)
  END
  WHILE(..another test..)
    ...
  END
  ...
}
Run Code Online (Sandbox Code Playgroud)

然而,当我在 C# 中执行此操作时,有人明智地认为宏不好,而且我不想编写 C# 解析器,因此我必须手动生成代码。这是一个巨大的痛苦,但与通常的编码方式相比,它仍然是值得的。