仔细阅读signal(7)、signal-safety(7)和sigaction(2)。sa_restorer
已过时,您被禁止使用它。
如何使其正常工作?
所以YouCompleteMe没有显示它是正确的(而且很聪明!)。
(您的问题应该是:“YouCompleteMe 如何足够聪明地隐藏sa_restorer
?”)
sa_restorer
更有趣的问题是为什么它显然出现在 eg中时没有显示它/usr/include/x86_64-linux-gnu/bits/sigaction.h
,但这是一个不同的问题(我不知道它的答案)。如果你完成了特定的标准函数(例如,有一些关于它们的配置文件),我不会感到惊讶。BTW YouCompleteMe是免费软件或开源软件,因此您可以研究它的源代码。
sa_restorer
is的类型__sigrestore_t
(参见/usr/include/asm-generic/signal.h
参考资料)和以下划线开头的标识符保留给实现,不应由用户代码使用,因此 YouCompleteMe 可能会跳过此类字段或数据。这只是一个猜测。请自己查看YouCompleteMe源代码(也许还有其他工具的代码,例如libclang
,它使用的)。
我真正想问的是为什么你不能完成我向我展示更多像 sa_handler 这样的 sigaction 成员
在我的 Linux 系统上,sa_handler
是一个宏,因为/usr/include/x86_64-linux-gnu/bits/sigaction.h
(内部包含自<signal.h>
)包含:
# define sa_handler __sigaction_handler.sa_handler
如果 YouCompleteMe 不在完成菜单中显示所有宏,我不会感到惊讶。他们太多了!这(只是一个猜测)可以解释为什么sa_handler
没有明确建议完成。
(也许如果您键入siga.sa_
完成者可能会更明智并提出建议 sa_handler
,但我没有尝试)
你struct sigaction
只是文档告诉的。实际的实现更为复杂。如果您想了解,请研究它,然后改进 YouCompleteMe 的行为。向YouCompleteMe提出一个补丁(通过几周或几个月的工作)以改善其行为。
YouCompleteMe 上的未来补丁可能会专门处理以下划线开头的标识符和使用它们的预处理器宏。这是一个有趣的项目,但可能需要几个月的时间。