`
oldrev
  • 浏览: 233923 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
社区版块
存档分类
最新评论

D语言在编译期添加变量

阅读更多
今天终于研究出了用递归模板实现D语言编译时字符串连接的方法,我实在是高兴得不得了。
其实方法很简单,一点就破,下面的代码很好的说明了问题,在编译时16行会在 main() 函数体内添加三个变量,分别是:int foo0, long foo1, float foo2。
用这种方法甚至可以在编译期为类添加成员函数、变量、类型定义等等,反正只要是符合语法的就可以,不像 mixin template 有那么多的限制。

1 import std.metastrings;
2 import std.stdio;
3
4 private template GenVars(int N, char[] S, T, V...)
5 {
6 public const char[] Result = S ~ Format!("%s foo%s;", T.stringof, N);
7 public enum { Index = N + 1 }
8 pragma(msg, Result ~ "\n");
9 static if(V.length > 0)
10 mixin GenVars!(Index, Result, V);
11 }
12
13 void main()
14 {
15
16 mixin(GenVars!(0, "", int, long, float).Result);
17 }
分享到:
评论

相关推荐

    试题高中信息技术期学科Python语言基础期中考试.doc

    10. 可直接执行的程序:机器语言程序可以直接被计算机执行,而高级语言程序、汇编语言程序和Python源程序需要经过编译或解释才能运行。 11. 数据类型float:在Python中,`float`表示浮点型数据,用于存储带有小数的...

    C++PracticeC++PracticeC++PracticeC++Practice

    - 支持编译期和运行期的常量。 **4. 解释C++程序的编译过程,在编译过程中会出现哪些类型的错误,它们在本质上有何区别?** - **编译过程:** - 预处理阶段:处理头文件包含、宏定义等。 - 编译阶段:将源代码...

    2021-2022计算机二级等级考试试题及答案No.4161.docx

    3. Access是一款关系型数据库管理系统,用户可以通过它来显示、添加或修改表中的数据,但创建报表通常需要在设计视图中进行。 4. Access数据库是基于关系模型的,这意味着数据被组织成表格形式,表格之间通过关系...

    经常会被人问到C++问题解答

    1. **多态类中的虚函数表**:虚函数表是在编译期创建的,它包含了类中所有虚函数的入口地址。每个含有虚函数的类都有一个这样的表。然而,对象的虚函数表指针是在运行时,即在构造函数被调用时初始化的。这使得在...

    java基础及面向对象试题.docx

    - 重载发生在同一类中,根据方法名和参数列表进行区分,编译期决定。 - 重写发生在父类与子类之间,根据方法名和参数列表完全相同,但子类方法覆盖父类方法,运行期决定。 14、方法重载的条件是方法名相同,参数...

    搭建scala环境,已验证。

    继续根据描述,将解压后的Scala bin目录(D:\local\scala-2.8.1.final\bin)添加到系统的PATH环境变量中,确保命令行下可以直接调用Scala执行工具。这一步骤对于无缝集成Scala到开发环境中至关重要。 4. **验证...

    Java程序设计笔试期末试卷试题及答案2套.docx

    编译期不会有错误。 **10. 以下不属于基本数据类型的是:(D)** - **选项解析**: - A、byte:错误。byte是基本数据类型之一。 - B、int:错误。int也是基本数据类型之一。 - C、char:错误。char同样是基本数据...

    c#学习笔记.txt

    c#学习笔记(1) ...(Microsoft后来在完全面向.NET框架的开发语言集中加入了Visual J#.NET,算是对Java语言用户的一种照顾。) 有人说,选择C#意味着选择MS(在中国的程序员当中,这并不是件值得自豪的事...

    你必须知道的495个C语言问题

    `auto`关键字用于声明变量,指示变量是在函数内部定义的,并且它的生存期仅限于该函数。虽然在现代C中使用`auto`并不常见,但在C89标准中,它是默认的存储类别。 **1.6 定义链表时出现的问题** 当尝试定义一个链表...

    495个C语言问题(经典编程系列)

    `auto`关键字用于声明变量,它告诉编译器变量的类型将在初始化时自动推断。例如: ```c auto x = 5; // x被推断为int ``` 现代C语言中,`auto`不常用,因为它默认就是动态存储期。 #### 1.6 C语言中一个结构是否...

    java面试宝典

    `创建了四个`String`对象,因为在编译期 `"a" + "b" + "c"` 已经被优化为一个字符串常量,再加上`"d"`时会再创建一个新对象。 **1.37 `try...finally`结构** 即使`try`块中有`return`语句,`finally`块中的代码也...

    《你必须知道的495个C语言问题》.pdf

    在C90标准中,`auto`主要用于强调变量具有自动存储期。 **1.6 我似乎不能成功定义一个链表。** - 在定义链表时,结构体可以包含指向自身类型的指针。示例中的错误可能是因为`NODEPTR`的类型未被正确定义或使用。...

    达内_jsd1411第一次月考题

    当引用静态常量时,采用编译期绑定方式。 - D. **错误**:`final`和`abstract`不能同时修饰一个类,因为它们是互斥的。 ### 6. 字符串拼接 - **代码解析**: - `System.out.println(“” + 'a' + 1);` - `'a'` ...

    java面试宝典 吐血推荐,很全面

    - **知识点**: 该语句创建了1个`String`对象,因为字符串字面量在编译期会被优化合并。 - **注意事项**: 字符串常量的拼接会在编译期进行优化。 **38. try{}里有一个return语句,那么紧跟在这个try后的finally {}里...

    Java经典问题答案(带书签).pdf

    - 字符串字面量拼接时,JVM会在编译期优化成单个字符串。 - 即`String s = "abc";`,因此只会创建一个对象。 **String类为什么重写Object类的equals方法** - `String`类重写了`equals`方法,以便根据字符串内容...

Global site tag (gtag.js) - Google Analytics