如上所示,youcompleteme无法正确完成可能包含以下成员的sigaction结构(当然我知道sa_restorer元素已过时且不应使用):
那么,我的youcompleteme有什么问题吗?如何让它正常工作?
注意:我真正想问的是为什么youcompleteme能为我显示更多像sa_hander这样的sigaction成员,而只是sa_restorer,sa_mask和sa_flags。
答案 0 :(得分:1)
仔细阅读signal(7),signal-safety(7)和sigaction(2)。 sa_restorer
已过时,禁止使用它。
如何让它正常工作?
所以 YouCompleteMe 正确 (并且聪明!)没有显示。
(您的问题应该是:" YouCompleteMe如何聪明地隐藏sa_restorer
?")
更有趣的问题是,为什么它sa_restorer
显然出现在例如{1}}时没有显示出来。 /usr/include/x86_64-linux-gnu/bits/sigaction.h
,但这是一个不同的问题(我不知道答案)。如果你完成了特定的标准功能(例如,有一些关于它们的配置文件),我不会感到惊讶。 BTW YouCompleteMe为free software或open source,因此您可以研究其源代码。
sa_restorer
的类型为__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上的未来补丁可能会使用下划线和使用它们的预处理器宏来处理特定标识符。这是一个有趣的项目,但可能需要几个月的时间。