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

宏扩展可以非常方便&有所帮助: http://dtemplatelib.sourceforge.net/table.htm

VS

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

有帮助吗?

解决方案

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

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

和控制结构的混乱如下:

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;}
  ...
}

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

但是谁想为C,C ++或其他什么编写解析器?

所以,相反,我只是编写宏,以便我可以像这样编写代码:

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

然而,当我在C#中执行此操作时,有些人在他们的智慧决定宏是坏的,我不想编写C#解析器,所以我必须手动执行代码生成。这是一种皇室般的痛苦,但与通常的编码方式相比,它仍然值得。

其他提示

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

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

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

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

两者都有他们的问题。与宏不同,代码生成可以生成可读和可调试的(即使是一个单词?)代码,但它不够灵活,更难更改。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top