【问题标题】:Statement macros in DD 中的语句宏
【发布时间】:2014-04-09 20:59:48
【问题描述】:

我正在将我用 C++ 编写的一些代码移植到 D。有一次我引入了一个便利宏,其中包含一个赋值。喜欢

#define so_convenient(x) value = some_func(x,#x)

所以我使用宏来

  1. 访问实际符号及其字符串和

  2. 做一个作业。

我如何在 D 中实现这一点?

【问题讨论】:

  • 这样的宏在 C++ 中通常是不鼓励的。人们更喜欢内联函数。为什么?因为内联函数不仅类型安全,而且不能出现在任何上下文中。
  • 字符串化部分需要@DejanLekic 宏

标签: c++ macros c-preprocessor d


【解决方案1】:

您可以在编译时使用mixin 语句将字符串转换为代码,例如:

mixin("value = 123;");

以下函数将生成一个字符串,其中包含一个与您的 C 宏最接近的等效语句:

string soConvenient(alias A)()
{
    return std.string.format(
        'value = someFunc(%1$s, "%1$s");',
        __traits(identifier, A));
}

然后你会像这样使用它:

mixin(soConvenient!x);       // equivalent to 'so_convenient(x) in C

【讨论】:

  • 我更喜欢模板混合。它们包含在dlang.org 的语言参考中。
  • 引号需要更正。否则就像魅力一样工作。
  • 我个人会改用string soConvenient(string A);。需要在呼叫现场报价,否则只是简单的 CTFE,没有实例化。除非计算成本很高,否则在这种情况下,模板实例化可能会在给定缓存的情况下更好地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多