我运行一个小Lua块作为事件循环,调用luaL_loadstring()来加载它。注意,在这些示例中我有两个C函数;函数logmsg()将其字符串参数输出到日志文件,函数getevt()等待,直到事件准备好传递给块,并在事件发生时返回整数事件ID。
当我加载这个块时:
logmsg( 'Entering evt loop' )
while true do
local evt
evt = getevt()
logmsg( 'Got event '..evt )
if evt == 73 then
logmsg( "Event equal to 73" )
end
end
logmsg( "Exited evt loop" )
加载成功,当我运行它时,我得到了完全预期的输出。
但是如果我试图像这样改变'if'语句中的条件:
logmsg( 'Entering evt loop' )
while true do
local evt
evt = getevt()
logmsg( 'Got event '..evt )
if evt < 73 then
logmsg( "Event less than 73" )
elseif evt > 73 then
logmsg( "Event greater than 73" )
else
logmsg( "Event equal to 73" )
end
end
logmsg( "Exited evt loop" )
则加载失败,并返回错误码3和错误字符串
[string "logmsg('进入evt循环')…"]:6: 'then' expected near ';'
这怎么可能?数据块中甚至没有';'字符。是否有可能,如果我的编辑器把CR而不是CR+LF,它混淆了编译器?
我找到问题了。数据块是通过XML接口传入的,在这个过程中"<"似乎被转换为"<"。这就解释了神秘的错误消息,以及原始代码中不存在的";"。在将传入的字符串传递给luaL_loadstring()之前,我通过对传入的字符串进行原始缓冲区转储才发现了这一点。哇。真没想到。