【问题标题】:Emacs 'csharp-mode' Byte Compilation ErrorEmacs 'csharp-mode' 字节编译错误
【发布时间】:2013-12-11 20:11:40
【问题描述】:

当我尝试在 Emacs 24.2.1 下对 csharp-mode 进行字节编译时,我收到以下错误:

csharp-mode.el:2028:1:Error: Symbol's value as variable is void: csharp-enum-decl-re

This post 确认了同样的编译问题并提供了以下补救措施:

我尝试通过 C-x C-e 手动定义 csharp-enum-decl-re 定义常量;这样就可以编译了。

这个补救措施也对我有用!但是,这种补救措施给我留下了几个问题:

  1. 没有预定义csharp-enum-decl-re,为什么csharp-mode.el字节编译失败? (csharp-mode.el 的源代码请参见第一个链接。)
  2. 在不修改 csharp-mode.el 的情况下,有没有更好的解决这个编译问题的方法?
  3. 第 2028 行 指示的错误涉及以下定义。 csharp-enum-decl-re 的依赖在哪里?
(defconst csharp-font-lock-keywords-2 (c-lang-const c-matchers-2 csharp)
  "Fast normal highlighting for C# mode.")

【问题讨论】:

标签: c# emacs compilation compiler-errors elisp


【解决方案1】:

据我所知:

  1. 文件无法进行字节编译,因为宏需要尚未定义的符号值。这个错误传给了一些程序员,因为他们正在使用 emacs 会话进行开发,他们在其中评估了他们正在编写的一些代码。编译错误的典型解决方案是使用eval-and-compile 宏来处理编译时需要知道的那些表达式。

  2. byte-compile 之前使用eval-buffer 是一种避免修改源的解决方法。编写补丁并将其发送给作者是另一种选择。

  3. 代码相对复杂,因为它严重依赖于宏。 c-lang-defconst 应该定义 c-matchers-1c-matchers-2c-matchers-3 的值,但对于 c-matchers-2,需要 csharp-enum-decl-re 的值(参见第 1304 行)。请注意,符号的名称 (c-matchers-*) 是由 c-lang-defconst 宏本身创建的。

【讨论】:

  • 在这种情况下可能需要eval-and-compile,因为该变量似乎也在运行时使用。
  • juanleon - 我已经按照您在回答的两个部分中给出的指导成功地对 csharp-mode.el 进行了字节编译。 (在使用 --no-init-file 选项运行 Emacs 后,我独立测试了每种方法。)我在我的问题中添加了一个数字 3. 项目...您对为什么在 line 2028 抛出编译错误?我不清楚csharp-font-lock-keywords-2csharp-enum-decl-re 的依赖。
  • 是的,您添加的项目 3. 会有所帮助。 csharp-font-lock-keywords-2 取决于 c-matchers-2(在 cc-fonts.el 中定义)。 c-matchers-2 又依赖于 c-basic-matchers-after(在 csharp-mode.el 中定义)。最后,c-basic-matchers-after 引用 csharp-enum-decl-re
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多