2

我将 CEDET 配置为为 MinGW gcc 自动完成,它工作得很好,但是我无法让 g++ 工作来完成 STL 库的成员。例如,我无法自动完成 std​​::string 变量以获取 c_str() 或其他函数:

#include <string>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    string s;
    s.       // no pop up member functions here
    return 0;
}

这是我的 .emacs 的配置部分:

;; setting up for semantic-mode
(semantic-mode 1)
(require 'semantic/bovine/c)

(setq MinGW-64-base-dir 
    "D:/MinGW/x86_64-w64-mingw32/include")
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/crtdefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/yvals.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/vadefs.h"))
(add-to-list 'semantic-lex-c-preprocessor-symbol-file 
     (concat MinGW-64-base-dir "/comdefsp.h"))
(semantic-c-reset-preprocessor-symbol-map)

(defconst user-include-dirs
  (list ".." "../include" "../inc" "../common" "../public"
        "../.." "../../include" "../../inc" "../../common" "../../public"))
(defconst win32-include-dirs
  (list "D:/MinGW/include"
        "D:/MinGW/x86_64-w64-mingw32/include"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include/c++"
    "D:/MinGW/lib/gcc/x86_64-w64-mingw32/4.7.2/include-fixed"
))

(let ((include-dirs user-include-dirs))
  (when (eq system-type 'windows-nt)
    (setq include-dirs (append include-dirs win32-include-dirs)))
  (mapc (lambda (dir)
          (semantic-add-system-include dir 'c++-mode)
          (semantic-add-system-include dir 'c-mode))
        include-dirs))

我的配置有问题吗?需要对 MinGW g++ 进行正确配置。

4

1 回答 1

0

我在没有您的配置的情况下在我的 Ubuntu 系统上尝试了您的示例,它提供的完成比我知道的要多。我猜 Semantic 不知道某些包含文件在哪里,或者没有设置正确的预处理器符号。

如果你这样做:

M-x load-library RET semantic/analyze/debug RET

然后您可以将光标放在您的样本上并执行以下操作:

M-x semantic-analyze-debug-assist RET

它会给你一堆提示和额外的命令来尝试挖掘问题。

我知道您在设置中设置了所有包含和预处理器文件。那部分对我来说似乎没问题。

semantic/bovine/gcc.el 中的代码应该向您的 GCC 查询您提供的用于查找 STL 标头之类的信息的类型。编译器提供 STL 标头使用的某些类型的 #define 值,并且可能不在您为预处理器符号提供的其他 ming 标头中。

不幸的是,它为它尝试使用的 C++ 编译器提供了硬编码的名称。如果您的编译器有其他名称,您可能需要编辑 gcc.el 源文件以使其工作。如果您这样做,请通过电子邮件发送 cedet-devel 邮件列表,以便我们可以在 CEDET 中进行更改。

或者,加载您的 string.h 文件所在的任何位置,并找到它应该用于完成的定义。查看哪些#if 语句将其过滤掉,然后使用:

Mx 语义-c-描述-环境 RET

看看这可能是如何相关的。

于 2013-03-20T00:02:15.927 回答