如何在编译时生成变量声明?

时间:2013-11-23 13:29:29

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

我想定义一个宏或其他一些方法,我可以在编译时生成类似的变量声明。例如。我想声明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中可能还有一些其他更优雅,更灵活的编译时元编程工具?

2 个答案:

答案 0 :(得分:1)

总之,没有。

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

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

答案 1 :(得分:1)

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

根本原因是var_name的内容在编译时是未知的,因此编译器无法知道甚至应该命名的变量。但即使是这种情况,变量名冲突怎么办?如果编译器允许这样,那么堆栈布局会是什么,因为局部变量的数量是未知的?

如果能够这样做,请允许我添加甚至,然后您的变量将在本地范围内声明,并且不会在for循环之外访问

在你的位置,我会尝试回到你真正想要完成的事情,并思考是否需要运行时构造。

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

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