【问题标题】:How can I generate variable declarations in compile time?如何在编译时生成变量声明?
【发布时间】:2013-11-23 13:29:28
【问题描述】:

我想定义一个宏或其他方式,我可以在编译时生成类似的变量声明。例如。我想像这样声明 50 个 NSString 变量:#define VAR_GENERATOR (var_name, var_content) NSString* var_name = @"var_content" 并在 for 循环中执行:

for(NSString* string in [stringArray count])
  {     
       NSString* var_name = [NSString stringWithFormat: @"string%d", iteration];
       VAR_GENERATOR (var_name, string);
       iteration++;
      }

假设[stringArray count] == 50 所以我想要有 50 个 NSString 变量声明,如下所示:NSString* string1 = @"first string from array" 等等...

那么有一些预处理器方法可以实现这一点吗?或者可能在 Objective-C 中还有其他一些更优雅、更灵活的编译时元编程工具?

【问题讨论】:

  • 为什么需要在编译时完成?你想完成什么。

标签: ios objective-c nsarray c-preprocessor metaprogramming


【解决方案1】:

由于多种原因,您想要做的事情无法使用编译时构造来完成;

根本原因是var_name的内容在编译时是未知的,所以编译器甚至都不可能知道变量应该取什么名字。但即使是这样,变量名冲突怎么办?考虑到局部变量的数量未知,如果编译器允许这样做,堆栈布局会是什么?

如果您能够做到这一点,请允许我添加 即使,那么您的变量将在本地范围内声明,并且在您的 for 循环之外无法访问。

在您的位置上,我会尝试回到您真正想要完成的工作,并考虑是否需要运行时构造。

如果答案是肯定的(您是否正在尝试为某种语言构建解释器?),那么我们有工具可以将任意名称映射到值,例如 NSMutableDictionnarystd::map

TL;DR : ,也许你可以扩展一下你想要完成的事情。

【讨论】:

  • 我只是在试验 Objective-C 的代码生成能力。我知道预处理器是一个坏方法。但是可能还有其他方法吗?说自动生成一些重复的代码?
  • 您可能想了解关联对象sebastianrehnby.com/blog/2013/01/24/…
【解决方案2】:

一句话,没有。

您发布的是运行时代码,而不是编译时代码。

如果要创建字符串的有序列表,请使用可变数组。这就是它的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    相关资源
    最近更新 更多