字节编译禁用警告做什么



无论参数是什么,它似乎都不会起任何作用。它也不会以任何方式影响字节编译警告。如果根据其描述使用。有没有关于如何使用它的例子?

例如,下面的代码:

(defmacro deflocal (var &rest body)
(let ((symb var)
(val (car body))
(doc (cadr body)))
`(progn
(let ((byte-compile-warnings nil))
;; (byte-compile-disable-warning 'make-local)
(set (make-local-variable ',symb) ,val)
(put ',symb 'variable-documentation ,doc)
;; (byte-compile-enable-warning 'make-local)
))))

可以对byte-compile-warnings做任何它想做的事情,而且它不会以任何方式影响编译器的输出(我仍然收到关于分配给自由变量的警告。

编辑:

因为这在我上面的描述中是不透明的。以下是我不想使用defvar的原因。我有一个交互式函数,它将启动某种交互式shell,用于与Emacs之外的程序进行通信。这个shell可以由用户直接启动,也可以在进入几种不同的主要模式或执行其他任务(如编译、检查语法等)时间接启动。系统相当复杂。

我多次遇到某些函数最终可能会在我不想要的缓冲区中设置变量。例如,当编译钩子调用一个函数时,该函数假定它是在拥有连接对象的缓冲区中调用的。连接可能会失败,因此,一旦系统发现它因任何原因失败,它就会尝试自动恢复连接(不幸的是,我必须连接的另一个程序非常不稳定,其通信设施实施不力)。因此,例如,如果flymake进程突然意识到它需要恢复连接,它将在flymake当时的缓冲区中创建连接。类似地,编译模式缓冲区、完成缓冲区、帮助缓冲区等等。在上下文发生这些变化后,很难跟上。

现在,当我可以确定没有其他缓冲区会意外地声明变量来引用连接对象,否则它会出错时,我是安全的,而且很容易在出现问题时进行调试和故障排除。然而,一旦我使用defvar,过了一段时间,我意识到已经创建了一些胭脂复制过程,我完全不知道是谁做的。

事实上,byte-compile-warnings并不能满足您的要求。相反,您可能希望在某个地方用(defvar <VAR>)声明变量,或者将触发警告的代码封装在with-no-warnings中。

代码中byte-compile-warnings的let绑定将在代码运行时应用,而不是在编译时应用。


编辑:

这里有一个简单的测试,可以确信只使用一个参数的defvar不会在任何地方绑定变量,如下所述:

(defvar foo)
(boundp 'foo) ;; -> nil
(defvar bar t)
(boundp 'bar) ;; -> t

变量byte-compile-warnings最好用作本地文件变量,用于控制批处理期间输出的警告编译。

听起来你很担心使用的副作用defvar,但它只创建一个动态的全局变量绑定(除非变量已经本地绑定)。

创建本地变量后,可以使用make-local-variable从函数中,使变量缓冲区成为当前缓冲区,但对于所有其他缓冲区保持全局。所以如果你只调用make-local-variable一次,则只有两份变量,一个动态绑定并与所有缓冲区共享的变量,以及另一个是特定于单个缓冲区的。强调文本(使局部变量可变)

Make VARIABLE have a separate value in the current buffer.
Other buffers will continue to share a common default value.

如果您想确保应该调查的变量词汇绑定。

最后,为了在批量编译此.el时消除警告文件将以下代码放在文件底部:

;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End:

最新更新