#ifdef上的cedet解析问题

nir*_*235 5 emacs cedet

我是emacs cedet用户.我得到了cedet的大力帮助.

但是,我在cedet中发现了一些错误#ifdef处理错误.不确定它是来自cedet内部还是我的错误配置.我引用了Curl中发生此问题的一些代码.

#ifdef CURL_DO_LINEEND_CONV
  if((data->set.crlf) || (data->set.prefer_ascii)) {
#else
  if(data->set.crlf) {
#endif /* CURL_DO_LINEEND_CONV */
    endofline_native  = "\n";
Run Code Online (Sandbox Code Playgroud)

使用此代码,必须存在一些错误括号匹配.因为我使用(eassist-list-methods)或其他cedet-semantic函数(跳转到定义)时出错.

我很容易猜到这可能来自#ifdef .. #endif block中的两个大括号.我承认这些是这样的.

#ifdef CURL_DO_LINEEND_CONV
  if((data->set.crlf) || (data->set.prefer_ascii)) 
#else
  if(data->set.crlf) 
#endif /* CURL_DO_LINEEND_CONV */
{
    endofline_native  = "\n";
Run Code Online (Sandbox Code Playgroud)

在此之后,cedet语义功能运行良好.

对此有何想法?它是否来自cedet解析器问题?

如果有一点我必须在cedet配置,你能给我一些见解吗?

谢谢

abo*_*abo 0

这似乎是一个设置semantic-lex-c-preprocessor-symbol-file 可以解决的问题。根据我读到的有关 CEDET 的内容,它不仅会随心所欲地扩展每个宏,而且只会扩展semantic-lex-c-preprocessor-symbol-file. 因此,您应该将定义的文件添加CURL_DO_LINEEND_CONV到此列表中。这是一个例子:

(add-to-list 'semantic-lex-c-preprocessor-symbol-file
             "~/Software/deal.II/include/deal.II/base/config.h")
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。