如果我将以下内容放入 foo.el :

(defun whitespace-redraw ()
  (eval-when-compile (require 'whitespace nil t))
  (when (require 'whitespace nil t)
    (if whitespace-mode
        (whitespace-mode 0))
    (whitespace-mode 1)))

然后字节编译它:
emacs -Q --batch --eval '(byte-compile-file "foo.el")'

我收到以下警告:
In end of data:
foo.el:7:1:Warning: the function `whitespace-mode' might not be defined at
    runtime.
Wrote foo.elc

当然 whitespace-mode 可以在运行时未定义,但它不应该被执行,除非空白加载成功。如果空白加载,则 whitespace-mode 将被定义。

这个警告是 emacs 编译器限制的结果还是我做错了什么?

最佳答案

我在这里添加我在上面作为评论的回复,仅供记录。

编译器说的是该函数是在编译时定义的,但在您运行代码时它可能不存在(它告诉您在运行代码时必须事先要求它)。因此,仅当您只需要在该包中定义的宏时,才可能是 eval-when-compile 的好习惯。如果您还需要函数和/或变量,您应该只是 require 包,而不是在 eval-when-compile 下,而是始终。

关于emacs - 字节编译时警告 : the function 'whitespace-mode' might not be defined at runtime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8902609/

10-12 05:11