在我的Scala/SBT项目中,我有一个文件,最多需要5(!)分钟才能编译.所有其他的都可以在几秒钟内编译.这使得开发非常痛苦.
我确信我在滥用一些Scala结构,但我不知道如何调试它.如何在Scala中调试长编译时间?
我正在使用Scala 2.9.2和SBT 0.11.2
我有这个宏代码,它允许我使用一个构造将C枚举和枚举名称列表定义为字符串.它阻止我不得不复制枚举器名称(并可能为大型列表引入错误).
#define ENUM_DEFINITIONS(F) \
F(0, Item1) \
F(5, Item2) \
F(15, Item3) \
...
F(63, ItemN)
Run Code Online (Sandbox Code Playgroud)
然后:
enum Items {
#define ITEM_ENUM_DEFINE(id, name) name = id,
ENUM_DEFINITIONS(ITEM_ENUM_DEFINE)
#undef ITEM_ENUM_DEFINE
Run Code Online (Sandbox Code Playgroud)
当扩展时,应该产生:
enum Items {
Item1 = 0,
Item2 = 5,
Item3 = 15,
...
ItemN = 63,
}
Run Code Online (Sandbox Code Playgroud)
在实现文件中,我有这个代码:
const char* itemNames[TOTAL_ITEMS];
int iter = 0;
#define ITEM_STRING_DEFINE(id, name) itemNames[iter++] = #name;
ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
#undef ITEM_STRING_DEFINE
Run Code Online (Sandbox Code Playgroud)
当扩展时,产生:
itemNames[iter++] = "Item1";
itemNames[iter++] = "Item2";
itemNames[iter++] = "Item3";
...
itemNames[iter++] = "ItemN"; …Run Code Online (Sandbox Code Playgroud) 这是我刚刚在工作中遇到的一些代码的简化版本:
#include <stdio.h>
#define F(G) G(1)
#define G(x) x+1
int main() {
printf("%d\n", F(G));
}
Run Code Online (Sandbox Code Playgroud)
打印2.
现在,我可以看到F(G)扩展到G(1)然后G(1)扩展到2,但我不清楚为什么.我本来期望得到一个错误,G不是printf行的函数.
预处理器如何解析这样的代码?